一、GIT 基础:
1、取得项目的仓库
git init
git add FILES
git clone [https/http、ssh、git]
2、记录每次更新到仓库
git status
git status -s 或 git status --short
.gitignore
git diff 【当前工作目录与暂存】
git diff --staged 【暂存与上次提交快照】
git commit
git commit -v(详细提示)
删除暂存区
git rm FILES 【git rm log/*.log,删除 log/ 目录下扩展名为 .log 的所有文件】
git rm -f FILES (修改过且已经放到缓存区)
git rm --cached FILES (保留在硬盘,但不继续跟踪)
git mv file_from file_to
3、查看提交历史
git log
git log -p -2 (显示每次提交的内容差异,显示最近的2次更新)
git log --stat (显示简要的增改行数统计)
git log --pretty=oneline/short/full/fuller/format
git log --graph
git log 【--since --until -n --author --committer】
gitk
4、撤销
git commit --amend (撤销刚才的提交操作,重新commit暂存区新内容)
取消已经暂存的文件
git reset HEAD <file> 【有提示】
取消工作目录已经修改的文件
git checkout -- <file> 【危险】【有提示】
注意:任何已经提交到GIT的数据都可以被恢复。
5、远程仓库的使用
git remote (至少有一个origin的远程库,git默认使用这个来标识你所克隆的原始仓库)
git remote -v (显示对应的克隆地址)
git remote add [shortname] [url] ( 添加一个新的远程仓库)
git fetch [remote-name] (fetch只是将远端仓库数据拉下来,并不自动合并到当前分支)
git pull (如果设置了某个分支跟踪远端仓库某个分支,远端分支自动合并到本地仓库的当前分支。
git push [remote-name] [branch-name] (推到remote服务器上的某个branch上)
git remote rename [origin] [after]
git remote rm [remote-name]
二、分支
git branch [branch-name] 【新建一个分支】
git checkout [branch-name] 【切换到该新分支】
git checkout -b [branch-name] 【新建并切换到新分支,上两条命令的结合】
git merge [branch-name] 【合并branch-name分支到当前分支】
git branch -d [branch-name] 【删除分支】
git branch 【列出当前所有分支】
git branch -v 【查看各个分支最后一次commit信息】
git branch --merged 【查看哪些分支已经被合并到当前分支】
git branch --no-merged 【查看哪些分支没有被合并到当前分支】
【已经合并的分支可以删除,未合并最好不要删除】
三、远程分支
(远程库名)/(分支名) 如:origin/master
git fetch [remote-name] 【fetch只是将远端仓库数据拉下来,并不自动合并到当前分支】
获取尚未拥有的数据,更新本地数据库,移动指针(如origin/master)。
git push [remote-name] [local-branch]:[remote-branch] 【提取本地分支更新远程仓库某个分支】
eg:
git push origin serverfix 【取出本地分支serverfix,更新远程仓库serverfix分支】
git push origin serverfix:awesomebranch 【取出本地分支serverfix,更新远程仓库awesomebranch】
fetch之后:不会有新的serverfix分支,只有无法移动的origin/serverfix指针
git merge [remote-name]/[remote-branch] 【合并远程分支到当前分支】
git checkout -b [branch] [remote-name]/[remote-branch] 【在远程分支的基础上分化出一个新分支】
跟踪分支
git checkout --track [remote-name]/[remote-branch] 简化上一条指令
eg:git checkout --track origin/serverfix
git checkout --b [branch] [remote-name]/[remote-branch] 绑定远程分支和本地分支
eg:git checkout -b sf origin/serverfix
删除远程分支
git push origin :serverfix 用空来更新远程分支
四、衍合
git rebase master 【当前分支衍合到master分支上】
git checkout master 【切换到master分支】
git merge experiment 【快进合并】
git rebase --onto master server client 【检出client分支,找出client分支和server分支的共同祖先之后的变化,在master上重演】
git rebase master server 【检出特性分支server,在主分支master上重演】【省去切换到server这一步】
注意:永远不用衍合那些已经推送到公共仓库的更新。
五、服务器上的Git
协议:本地、SSH、Git、HTTP
把一个仓库克隆为纯仓库
git clone --bare my_project my_project.git
纯目录转移到服务器
scp -r my_project.git user@git.example.com:opt/git
访问权限:建立账户、git账户,用户发SSH公钥
ssh-keygen
架设服务器
1、创建git用户,并创建.ssh目录。
2、将开发者的SSH公钥放在authorized_keys
3、git init --bare设定一个空仓库
4、开发者推送远程分支
5、git-shell替代shell
六、分布式Git
1、集中式工作流
2、集成管理员工作流
3、司令官与副官工作流
七、为项目做贡献
1、不要在更新中提交多余的白字符。
2、每次提交限定于完成一次逻辑功能。
3、提交说明:一行以内,50字符以下,空开一行后,再展开详细注解。祈使现在式语态。
4、详细注解:本次修订因由、不同实现之间的比较。
私有小型团队。
私有团队间协作。
公开的小型项目【没有更新主仓库分支的权限】。
公开的大型项目。