之前也工作了一段时间,但是对于git的使用基本上停留在 pull、add 、commit、push 上,也没有进行基本的整理,有一次某大厂同事让我复制他的一个commit到我的分支,我实在不知道怎么复制,也愣头青不好意思问,就把那个分支自己一点一点的改动复制过来,他看到我的操作后吃惊的表情我到现在还记得,整理一下大厂常用的git高级命令(git cherry-pick
、git revert
、git rebase
、git branch
、git checkout
、git stash
),以后妈妈再也不用担心我被同事嘲笑不会git了。
git clone 仓库地址
git clone -b 分支名 仓库地址
git fetch origin
git log
将单个文件放置到暂存区
git add 文件名
将所有changes放置到暂存区
git add .
该命令之后对加入暂存区的文件生效,即通过git add
命令后的文件才会被提交至本地仓库
如果只想提交暂存区中的某些文件,我们可以使用如下命令
git commit 文件名 文件名
该命令可以填写一条提交信息 若只使用 git commit
那么会将所有在暂存区的文件提交至本地仓库,且会进入vim的命令行进行提交信息的填写。
我们可以使用如下命令来进行编辑提交信息
git commit -m "这是我本次的提交信息"
有人可能会觉得每次都需要使用git add
之后才能使用git commit
不方便,其实也为我们提供了简写方式如下:
git commit -a -m "这是我本次的提交信息"
使用上述命令,我们可以直接对所有的changes进行提交,个人并不建议使用该命令,因为有些changes可能并不适合本次提交而是应该放到另一个commit中,我们可以针对本次需要提交的changes添加到暂存区然后再进行提交。
我们可以使用如下代码进行拉取
git pull origin 远程分支名:要合并的本地分支名
一般来说我们的本地分支名跟远程分支名是相同的,因此我们可以将本地分支名跟远程分支名进行合并然后省略冒号如下:
git pull origin 分支名
该命令可以将我们本地的仓库推送至远程仓库供其他人拉取合并等操作
我们可以使用如下代码进行推送
git push origin 本地分支名:远程分支名
一般来说我们的本地分支名跟远程分支名是相同的,因此我们可以将本地分支名跟远程分支名进行合并然后省略冒号如下:
git push origin 分支名
如果本地分支跟远程分支有冲突是推送不上去的,我们可以使用如下命令来强制推送:
git push --force origin 分支名
简写
git push -f origin 分支名
若多人共同开发一个分支,强制推送有可能覆盖他人代码,需慎用!!!
查看分支列表
git branch -a
该命令可查看当前仓库下存在的分支名列表
创建分支
git branch 分支名
删除分支(首先需要切到不是要删除的分支上去)
删除本地未推到远程仓库的分支(强制删除本地分支)
git branch -D 分支名
删除本地已经推到远程仓库的分支
git branch -d 分支名
完整语法
git push origin --delete 分支名
简写(使用 :
代替了 --delete
且没有空格)
git push origin :分支名
首先本地先拉取到最新的分支list后可通过该命令切换分支
git checkout 分支名
切换到新创建分支(该语法其实是先从当前分支新建分支然后切到该分支是git branch 分支名
与 git checkout 分支名
的结合)
git checkout -b 分支名
有时候我们会有这样的诉求,跟同事在不同的分支开发,你们两个的需求都还没有开发完成不能合码,但是你需要他的已开发的一次commit的内容,我们不可能跟同事去重复开发一份,此时我们可以使用该命令。其中commit的id可以从我们的仓库提交中查看到,或是使用git log
查看提交日志,里面的记录就有提交的commit的id。
git cherry-pick 需要复制过来的commit的id
执行完这个命令后,同事的commit便会同步到你这个分支上,你便可以使用同事开发的功能了。
有时候我们在开发时,刚在提交了代码便发现刚才的提交有个明显bug或是刚才的提交漏了部分东西,我们当然可以再提交一个commit来修改发现的问题,但是如果这几次提交只是为了解决同一个问题,那么并不建议提交多个commit,可以在本地回滚代码修改好了之后再次提交,命令如下:
git reset 想要回滚到的commit的id
修改完了之后重新提交即可。
如果我们在本地开发还未推送至远程仓库,那么以上代码足矣。
git push -f origin 分支名
强制推送。有时候我们提交了一个commit,在此之后,同事又在你的提交之后提交了他的commit,我们发现我们提交的commit有问题,或是产品说这个需求本次不跟车,那么我们的代码已经合进去了怎么办呢?我们此时可以使用该命令来提交一个与我们之前的commit 完全相反的commit 来抵消掉之前的提交。命令如下:
git revert 需要撤回commit的id
有人可能会问git reset
跟git revert
有什么区别呢?我们要知道,reset意为重置,在之后的commit会全部进行丢弃也不会有任何提交记录,revert会使用一个commit来抵消之前的commit,是有记录的,我们也不需要进行强制推送,以此来做到不发生更改的目的。
有时候我们正在开发一个需求,还没开发完,我们要去另一个分支开发,我们没法切分支重新拉代码,它要求我们必须提交到本地仓库才能拉代码,所以此时我们可以将我们在本分支的changes先贮藏起来然后切分支,命令如下:
git stash
使用该命令后我们做的changes就会被贮藏起来,我们可以到任何分支去拉代码或是修改,因为我们之前做的changes已经藏起来了,对外界是不可见的。
假设我们的另一个需求做完了,我们现在要切回原分支继续开发,我们可以先切到原分支,然后使用如下命令:
git stash pop
上述命令会弹出我们最后一次贮藏的changes,一般来说使用这个命令足够了,有时我们可能想要把所有贮藏的changes一起应用到当前分支,那么我们可以使用如下命令:
git stash apply
当然我们也可以查看贮藏的changes,命令与结果分别如下:
git stash list
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
删除某个stash自然也是可以的使用 git stash drop 贮藏的名字
git stash drop stash@{0}
删除全部stash
git stash clear
上述命令平时的工作绝对够了,还有一些查看diff命令用的很少,我从来没用到,在此不做赘述。