Git命令汇总
为了方便查阅,在这边做一个小结
版本回退
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。
穿梭前,用git log
可以查看提交历史,以便确定要回退到哪个版本,类似的还有git log --pretty=online
、git log --graph
要重返未来,用git reflog
查看命令历史,以便确定要回到未来的哪个版本。
撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,执行git reset --hard commit_id
,不过前提是没有推送到远程库。
删除文件
删除本地rm file
场景1:如果删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本 git checkout -- test.txt
场景2:真正删除 git rm file
删掉,并且git commit
添加远程库
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git
关联后,使用命令git push -u origin master
第一次推送master分支的所有内容
从远程库克隆
git clone
创建与合并分支
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:先切换到<name>
分支,然后执行git merge <name>
删除分支:git branch -d <name>
分支管理策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本;
你和你的小伙伴们每个人都在dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
Git在做merge
时会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息,我们不想丢掉信息就需要这样做,git merge --no-ff -m "merge with no-ff" dev
其中--no-ff
参数,表示禁用Fast forward
暂存
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop,回到工作现场。可以使用git stash list
查看已暂存的内容
多人协作提交代码的流程
查看远程库信息,使用git remote -v
;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
;
从远程抓取分支,使用git pull
,如果有冲突,要先处理冲突。
rebase
在多人开发模式下,往往很容易发生冲突,有些小伙伴往远端推送以后发现莫名其妙会多一个commit,导致不能是一条干净的直线,强迫症标识根本受不了。像下图一样,这时可以使用git rebase
解决问题
我们在pull时也可以加这样的参数 git pull --no-commit --rebase origin master
来解决问题
解决后的样子
如果感到很疑惑这边推荐两个很不错的学习资料:git book、廖雪峰的官方网站
对比
git diff commit-id-1 commit-id-2 --stat
忽略某个文件
git update-index --assume-unchanged config.xml