1

这篇文章结合实际开发情景,讲一些比较常用的git命令

查看更完整的清单:http://www.ruanyifeng.com/blo...
推荐一个cmd工具:更好看的界面,更舒适的用户体验
cmder: https://cmder.net/

前言

首先贴上阮一峰老师博客的一张图,做一个知识储备。

image.png

一、分支

首先,拿到一个项目地址,老大让你把项目拉下来,要执行什么命令呢?
 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 

image.png

从上图我们可以看出,git log仅能够查看commit-id、作者、日期以及注释,所以我更推荐大家使用git自带的可视化工具,无需单独安装,使用以下命令行即可打开:

gitk

image.png

我们可以通过这个可视化界面,快速看到最近的版本信息,包括修改了哪些文件,哪些具体内容

四、合并代码

我们可能需要将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,按照提示执行就推送到远程啦

image.png

五、撤销

回退上一个版本或指定版本
# 回退上一个版本
git reset --hard 

#回退指定版本
git reset --hard commit-id

注意,这个命令只是在你本地回退到上一个版本,并不是远程回退。回退之后查看状态提示git pull可以证明这一点。(根据提示git pull代码就会重新同步最新的)

image.png

刚修改好代码,查看了状态之后(还没有add),我想把当前的修改撤销掉
# 撤销所有修改
git checkout .

#撤销指定文件
git checkout 文件名
add之后提交到暂存区的代码,如何撤销将代码回到工作区?
git reset HEAD

image.png

注意:这里如果使用git reset --hard,暂存区的状态就会消失,回到未修改的状态

image.png

在A分支不小心merge了B分支,想撤回这一次merge

执行git reset --hard,再次查看git status,发现还是提示git push,怎么办呢?
执行以下操作,可以本地代码回到跟远程一致的状态,并且不提示git push

# 首先同步远程仓库,注意,这一步执行完还是会提示git push
git fetch --all

# 分支名在这里就是A
git reset --hard origin/分支名

image.png

仅撤回历史中的一次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

image.png

然后发现弹出了这样的窗口,不要慌,首先点击键盘"Esc",这时候多了一条提示:

image.png

然后同时按下"Shift"和":"

image.png

然后按下"q",再按回车

image.png

然后根据提示git push即可推送到远程

与其说revert命令是一个撤销,不如叫它“还原”,因为这个命令并不会影响第一次提交的版本,只是重新建立了一次提交,提交内容是commit-id内容的还原。这个命令掌握以后会经常用到的!

六、其他

暂时将未提交的变化移除,稍后再移入

偶尔会有这样的情境,我正在开发分支A,可是又给我临时安排了其他任务比较紧急,需要去B分支改东西,A分支我又不想提交,这时怎么办呢?

# 将当前未提交的内容临时保存,并加上备注方便查找
git stash save 备注

这时候再执行git status,会提示:nothing to commit, working tree clean
然后你就可以切到其他分支做别的事情了。
过后你再回到这个分支,执行:

# 查看stash列表
git stash list

image.png

怎么恢复刚才stash save的东西呢?

执行:

git stash apply stash@{0}

其中, "stash@{0}"是根据备注指定到版本,如果省略不写的话,默认取"stash@{0}",即最新的一次save

image.png

同样可以实现的命令行:

git stash pop stash@{0}

stash@{0} 用法同上
这两种命令的区别在于,pop可以理解为“弹出”,执行后会删掉这一次save记录,而apply只是移入变化,记录仍然保存。
具体使用哪一个可以根据自己的习惯。

如果觉得stash list记录太多了,想要清除,执行:

git stash clear

如果还有比较常用的命令,欢迎留言补充,一起进步


smile1213
207 声望17 粉丝

程序媛一枚