Git
一些介绍
开源的版本控制系统,处理项目版本管理
组成
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 一样都是用于从一个分支获取并且合并到当前分支
原分支
rebase后的结果
merge后的结果
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]
撤销某个提交,但执行命令后不进入编辑界面,也就是不会自动帮你提交文件,需要手动提交,和上一条的命令差别在于将撤销和提交分开了