这篇文章结合实际开发情景,讲一些比较常用的git命令
查看更完整的清单:http://www.ruanyifeng.com/blo...
推荐一个cmd工具:更好看的界面,更舒适的用户体验
cmder: https://cmder.net/
前言
首先贴上阮一峰老师博客的一张图,做一个知识储备。
一、分支
首先,拿到一个项目地址,老大让你把项目拉下来,要执行什么命令呢?
git clone 项目地址
刚拉下来的项目,需要切出自己的一个分支进行开发,要执行什么命令呢?
git checkout -b 分支名称
这样切出的只是自己的本地分支,如果需要让别人也能看到你的分支的代码,需要将这个分支推送到远程,要执行什么命令呢?
git push --set-upstream origin 要推送到远程的分支名称
怎么查看当前分支呢?
# 列出所有本地分支
git branch
# 列出所有远程分支
git branch -r
# 列出所有本地分支和远程分支
git branch -a
怎么切换到其他分支呢?
git checkout 分支名称
删除分支
# name是分支名称
#删除本地分支
git branch -d name
#删除远程分支
git push origin --delete name
二、修改并提交
我在一个分支修改了一些代码,怎么查看当前分支的文件修改状态呢?
git status
想具体查看改的内容,怎么操作?
# 显示工作区与暂存区的差异
# 执行后用键盘向下的箭头进行下拉,不要用滚轮
git diff
我又重新修改了一些代码或者文件,这时候我想提交代码到暂存区,怎么做呢?
# 全部提交
git add .
# 提交指定文件
git add 文件路径
上一步提交到暂存区的文件,怎么提交到仓库区呢?
# 写上对应的注释,便于区分
git commit -m 注释
执行了commit之后,怎样推送到远程?
git push
三、查看提交日志
有时候需要查看近期自己或其他同事在分支A的修改,怎么操作呢?
# 首先切到A分支
git checkout A
# 显示当前分支的版本历史
git log
从上图我们可以看出,git log仅能够查看commit-id、作者、日期以及注释,所以我更推荐大家使用git自带的可视化工具,无需单独安装,使用以下命令行即可打开:
gitk
我们可以通过这个可视化界面,快速看到最近的版本信息,包括修改了哪些文件,哪些具体内容
四、合并代码
我们可能需要将A分支的代码合并到B分支,如何操作呢?
# 首先切到分支B
git checkout B
#执行合并命令
git merge A
#merge之后如果有冲突,手动解决冲突(其实就是看哪些要哪些不要,手动操作取舍),然后执行:
git add .
git commit -m 注释
#如果没有冲突,执行推送到远程
git push
我们可能需要在A分支去合并B分支的某一次提交,怎么操作呢?
首先我们需要知道这一次提交的commit-id,这一次提交是在B分支生成的,所以我们需要先切到B分支:
git checkout B
可以通过上述的:
git log
gitk
将commit-id复制出来,复制时可以不用复制全部,复制15位左右就可以完全定位到对应的id,比如 d22gd6dmlr87sgsn,再切换到分支A
git checkout A
然后执行:
git cherry-pick d22gd6dmlr87sgsn
执行之后查看状态,会提示你git push,按照提示执行就推送到远程啦
五、撤销
回退上一个版本或指定版本
# 回退上一个版本
git reset --hard
#回退指定版本
git reset --hard commit-id
注意,这个命令只是在你本地回退到上一个版本,并不是远程回退。回退之后查看状态提示git pull可以证明这一点。(根据提示git pull代码就会重新同步最新的)
刚修改好代码,查看了状态之后(还没有add),我想把当前的修改撤销掉
# 撤销所有修改
git checkout .
#撤销指定文件
git checkout 文件名
add之后提交到暂存区的代码,如何撤销将代码回到工作区?
git reset HEAD
注意:这里如果使用git reset --hard,暂存区的状态就会消失,回到未修改的状态
在A分支不小心merge了B分支,想撤回这一次merge
执行git reset --hard,再次查看git status,发现还是提示git push,怎么办呢?
执行以下操作,可以本地代码回到跟远程一致的状态,并且不提示git push
# 首先同步远程仓库,注意,这一步执行完还是会提示git push
git fetch --all
# 分支名在这里就是A
git reset --hard origin/分支名
仅撤回历史中的一次commit-id,又不想影响后续已经commit的版本
在C分支开发,按照时间做了下列提交:
commit-id-c 2021.03.05
commit-id-b 2021.03.04
commit-id-a 2021.03.03
今天是2021.03.05,假如我想撤销掉 commit-id-a 这一次的提交内容,并且不影响后面的b和c,这要怎么做呢?
我们先把 commit-id-a 拿到,然后在C分支,执行以下命令:
git revert commit-id-a
然后发现弹出了这样的窗口,不要慌,首先点击键盘"Esc",这时候多了一条提示:
然后同时按下"Shift"和":"
然后按下"q",再按回车
然后根据提示git push即可推送到远程
与其说revert命令是一个撤销,不如叫它“还原”,因为这个命令并不会影响第一次提交的版本,只是重新建立了一次提交,提交内容是commit-id内容的还原。这个命令掌握以后会经常用到的!
六、其他
暂时将未提交的变化移除,稍后再移入
偶尔会有这样的情境,我正在开发分支A,可是又给我临时安排了其他任务比较紧急,需要去B分支改东西,A分支我又不想提交,这时怎么办呢?
# 将当前未提交的内容临时保存,并加上备注方便查找
git stash save 备注
这时候再执行git status,会提示:nothing to commit, working tree clean
然后你就可以切到其他分支做别的事情了。
过后你再回到这个分支,执行:
# 查看stash列表
git stash list
怎么恢复刚才stash save的东西呢?
执行:
git stash apply stash@{0}
其中, "stash@{0}"是根据备注指定到版本,如果省略不写的话,默认取"stash@{0}",即最新的一次save
同样可以实现的命令行:
git stash pop stash@{0}
stash@{0} 用法同上
这两种命令的区别在于,pop可以理解为“弹出”,执行后会删掉这一次save记录,而apply只是移入变化,记录仍然保存。
具体使用哪一个可以根据自己的习惯。
如果觉得stash list记录太多了,想要清除,执行:
git stash clear