一些git相关命令

138 阅读6分钟

Git

一些介绍

开源的版本控制系统,处理项目版本管理

组成

git.png

workspace工作区

index 缓存区/暂存区 临时存放改动,标记了工作区那些内容被git管理,能够更加灵活的控制我们的数据

repository本地仓库

remote远程仓库

#设置缓存区,提交本地仓库的意义

是实现分批分段提交,假设修改A、B、C、D四个文件,A、B文件与功能一相关,B、C文件与功能二相关,目前只有功能一开发完成并且想要提交,则可以通过git add 文件名的方式,进行有选择的提交,避免了一次性提交所有修改的文件,每一个功能应该单独做一次提交,这样能够提高版本历史记录的清晰,方便回滚

 

#提交到本地仓库

git commit -m '备注信息'

git commit -am '备注信息' 将文件直接提交至仓库,只能提交已经追踪过且修改了的文件

git commit --amend -m '备注信息'

修改最新的提交信息,push后不会增加新的commit记录,但是会修改本次的commithash, 也可以理解为删掉了重新提交了一次

amend适用场景:本地开发代码已经提交,提交后发现这次提交的代码有问题,或者漏交了一些文件

diff 比较

比较文件的不同

git diff [filename]                                      文件在缓存区和工作区的差异

git diff --cached/staged [filename]       显示文件在暂存区和上一次提交到本地 仓库的差异

git diff [commit1] [commit2]             显示两次提交之间的差异

branch管理

创建/重命名

git branch [branchName]                               创建,但不切换

git branch -m [oldName] [newName]  重命名分支

查看

git branch     查看本地分支

git branch -r  查看远程分支

git branch -a 查看远程和本地分支

切分支

git checkout [branchName]

git checkout -b [branchName]             创建+切换

git checkout -b feat-v1 origin feat-v1  克隆远端分支feat-v1到本地

合并

git merge [branchName]

git merge [branchName] --squash  将branchName合并到当前分支,并 branchName上的所有提交合并成一次提交

删除

git branch -D [branchName]         删除本地分支

git push origin -D [branchName]  删除远端分支

stash贮藏

场景

在一个功能未开发完成无法提交commit,但是需要rebase下master亦或是需要切到其他分支修改bug,则可以用stash来处理缓存区的代码

作用

将本地没提交的内容就行缓存并从当前分支移除,起到一个贮藏代码的作用

常用命令

git stash                    贮藏代码

git stash save '贮藏信息'

git stash list             查看当前贮藏区

---恢复

git stash pop [stashname]    恢复到工作区和缓存区,会移除stashid

git stash apply [stashname] 
恢复指定贮藏代码到工作区和缓存区,会保留stashid缓存的数据结构为堆栈,先进后出

---显示

git stash show -p                        显示最新的贮藏文件具体改动

git stash show -p stashname     显示指定的贮藏文件具体改动

---删除

git stash drop [stashname]        删除单个缓存

git stash clear                              全清

pull request模式

使用场景

为别人项目做贡献/修改bug

举例

有一个仓库,叫Repo A。你如果要往里贡献代码,首先要Fork这个Repo A,于是在你的Github账号下有了一个Repo A2。Clone到本地分支,然后你在这个A2下工作,Commit,push等。然后你希望原始仓库Repo A合并你的工作,你可以在Github上发起一个Pull Request,意思是请求Repo A的所有者从你的A2合并merge分支。 如果被审核通过并正式合并,这样你就为项目A做贡献了

rebase

git rebase 和git merge的区别

git rebase 和 git merge 一样都是用于从一个分支获取并且合并到当前分支

原分支

rebase1.png

rebase后的结果

rebase3.png

merge后的结果

rebase2.png

git rebase 提交记录清晰,但需要依次解决每回的冲突,可以用git add . +git rebase --continue来解决,如果不想要某次 rebase 的结果,那么需要使用 git rebase --skip 来跳过这次 rebase 操作

而merge只需要解决一次冲突

大部分公司其实会禁用rebase,不管是拉代码还是push代码统一都使用merge,虽然会多出无意义的一条提交记录,但至少能清楚地知道主线上谁合了的代码以及他们合代码的时间先后顺序

git rebase 交互模式

git rebase -i [base-commit]

参数 base-commit 就是指明操作的基点提交对象,基于这个基点进行 rebase 的操作,我们要把该基点之前的提交压缩成一次提交

在开发中,常会遇到在一个分支上产生了很多的无效的提交,这种情况下使用 rebase 的交互式模式可以把已经发生的多次提交压缩成一次提交,得到了一个干净的提交历史

执行完上述命令后,会进入编辑页面,进行下一步操作

每个commit前面有一个操作命令,默认是pick,表示该commit被选中进行rebase操作

命令说明
pick正常选中
reword选中,并且修改提交信息
edit选中,并且修改提交信息
squash选中,会将当前commit与上一个commit合并
fixup与squash相同,但不会保存当前commit的提交信息
exec执行其他shell命令

Cherry-pick

git cherry-pick [commit hash]

将其他分支上已提交的commit在当前分支再提交一次,产生新的commithash

当你在merge或者rebase的时候发现冲突太多了,可以用原分支check目标分支处理,然后再cherry-pick当前分支的每个提交,这样冲突就会少很多。或者另一分支上有些代码还没有merge到master,但是你当前分支又需要的时候,或者只想将某一次提交合入到本地当前分支上,就可以cherry-pick过来一份。

reset&revert

revert和reset都具有撤销回退的意思,但作用相差很大

区别

reset是彻底回退到指定的commit版本,该commit后所有commit都将被清除

revert仅仅是撤销指定commit的修改,并不会影响后续commit

reset执行后不会产生记录,revert执行后会产生

  git log 查看提交日志

reset相关命令

git reset                                               将所有暂存区回退到工作区

git reset --hard [commit hash]        将从commithash(不包括此hash)之后的丢弃

git reset --hard                                   将暂存区、工作区所有内容丢弃

git reset --soft [commit hash]           将从commithash(不包括此hash)之后的提交回退到 暂存区

git reset --soft HEAD~4                      回退最近4次提交到暂存区

revert相关命令

git revert [commit-id]  撤销某个提交

git revert -n|--no-commit [commit-id]

撤销某个提交,但执行命令后不进入编辑界面,也就是不会自动帮你提交文件,需要手动提交,和上一条的命令差别在于将撤销和提交分开了