不用再纠结git命令不会写了
learn-git-branching ,so easy
以下仅为个人记录
commit
- 提交 git commit -m “”
checkout
- 创建新分支 git checkout -b feature
log
- 查看 hash 记录 git log
合并分支
创建新节点 git merge feature
线性提交历史 git rebase master
HEAD
- HEAD,指向当前分支上的最近提交记录
- 分离 HEAD,是指向某个具体提交而不是分支名
- git checkout ‘hash’ 指向某次提交即可分离 HEAD
相对引用
^符号移动一步
- git checkout master^
- git checkout HEAD^
~符号移动多步
- git checkout HEAD~2
移动分支,当前分支指向另一个提交
- git branch -f master HEAD~3
- git branch -f feature #hash
撤销变更
git reset
- git reset HEAD~1,变更还在,但是处于未加入暂存区状态
git revert
- git revert HEAD,产生新节点 C,用于标识撤销的节点 B,内容和节点 A 一致
整理提交记录
- 当知道所需要的提交记录(并且还知道这些提交记录的哈希值)
- git cherry-pick #hash 将一些提交复制到当前所在的位置(HEAD)下面
- git cherry-pick C2 C4,在当前分支上,把其他的分支内容拿过来
交互式rebase
- 不清楚想要的提交记录的哈希值
- rebase -interactive,简写为 -i,打开一个 ui 框操作(文本框)
- git rebase -i HEAD~4
本地栈式提交
- 开发调试时添加了打印语句,不需要这些项
- 让 Git 复制解决问题的那一个提交记录,git rebase -i 或 git cherry-pick
- 本地 master-bug-console-bugfix,4 个节点
- 方法 1:git rebase -i HEAD~3 & git checkout master & git merge bugFix 删除中间项后 merge
- 方法 2:git checkout master & git cherry-pick bugfix 直接把 bugfix 节点转移
提交的技巧
分支 1 提交后,基于最新提交创建分支 2,再次提交,想修改分支 1 的提交记录中的内容(移动想要修改的到最前面),但可能存在 rebase 导致的冲突
- 先用 git rebase -i 将提交重新排序,然后把我们想要修改的提交记录挪到最前
- 再 commit –amend 来进行一些小修改
- 再 git rebase -i 来将他们调回原来的顺序
- 最后 master 移到修改的最前端
- git rebase -i HEAD~2 –solution-ordering C3,C2 ,重新排序
- git commit –amend,创建新的提交节点
- git rebase -i HEAD~2 –solution-ordering C2’’,C3’,重新排序
- git rebase caption master,合并
cherry-pick 可以将提交树上任何地方的提交记录取过来追加到 HEAD 上(只要不是 HEAD 上游的提交就没问题)
- git checkout master
- git cherry-pick C2,在 master 后加入新节点 c2
- git commit –amend,创建新的提交节点
- git cherry-pick C3,将 c3 作为最新节点合并
Tag
- 永远指向某个提交记录的标识,大版本,特性,bug
- git tag v1 C1 命名标签 v1,指向提交记录 C1
- git tag v1 side~1,side 的上一级打标签
- git checkout v1,head 指向标签
最近的锚点
<tag>_<numCommits>_g<hash>
- tag 表示的是离 ref 最近的标签, numCommits 是表示这个 ref 与 tag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。当 ref 提交记录上有某个标签时,则只输出标签名称
- git describe ,得到当前提交记录所在分支的最近节点及距离
多分支 rebase
- 有序的提交历史,两两合并
- git rebase master bugFix
- git rebase bugFix side
- 【禁止】git rebase c1,git rebase c2 后用 git rebase -i HEAD~2 排序,这样树无法看了
链式操作
- 例子 1,找记录节点
- git checkout HEAD
,git checkout HEAD^2,git checkout HEAD2 - git checkout HEAD
^22,简化
- git checkout HEAD
- 例子 2,为记录节点定义一个引用
- git checkout c1,git branch bugWork,git checkout master
- git branch bugWork master^^2^
分支操作
- 需要把 master 分支上最近的几次提交做不同的调整后,分别添加到各个的分支上。
- one 需要重新排序并删除 C5
- git cherry-pick C4 C3 C2
- two 仅需要重排排序
- git cherry-pick C5 C4 C3 C2
- three 只需要提交一次。
- git branch -f three C2
fetch/pull/push
- git fetch 更新状态(不改变文件),从远程仓库下载本地仓库中缺失的提交记录,更新远程分支指针
- git pull 是 git fetch 和 git merge 的缩写
举例
提交分支,master,本地开发完成,发现远端是 new master,四种处理
- 本地变基,远端线性提交记录
- git fetch;git rebase origin/master;git push;
- git pull –rebase;git push;
- 本地合并,远端合并
- git fetch;git merge origin/master;git push;
- git pull;git push;
- 本地变基,远端线性提交记录
合并特性分支,本地多个分支,但新功能只在最后做一次推送集成
- 方案 1
- git fetch;git checkout new;git cherry-pick xx xx xx;git branch -f master HEAD;git checkout master;git push;
- 方案 2
- git fetch;git rebase o/master side1;git rebase side1 side2;git rebase side2 master;
- 方案 1
和 merge 的对比
- Rebase 使你的提交树变得很干净, 所有的提交都在一条线上,但修改了提交树的历史
- git checkout mastre;git merge c1;git merge c2;git push;
远程分支
- git checkout -b totallyNotMaster o/master,创建 totallyNotMaster 分支,用于跟踪远程分支 o/master
- git branch -u o/master foo,本地 foo 分支跟踪 o/master
- git branch -u o/master,本地当前分支跟踪 o/master
提交
- git push origin master,切到本地仓库中的“master”分支,获取所有的提交,再到远程仓库“origin”中找到“master”分支,推送
place 的参数
- 当为 git push 指定 place 参数为 master 时,我们同时指定了提交记录的来源和去向。
- git push origin
: - git push origin master:new-branch,本地分支推送到远端新分支
fetch 的参数
- git fetch origin foo,远程仓库的 foo 分支上,获取所有本地不存在的提交,放到本地的 o/foo 上
- git push origin master:new-branch,本地 master 拉取远端 new-branch 分支
省略 source
- git push origin :side,删除了远程仓库中的 side 分支
- git fetch origin :bugFix,会在本地创建一个新分支
git pull 是 fetch 后跟 merge 的缩写
- git pull origin foo 相当于:git fetch origin foo; git merge o/foo
git pull origin bar~1:bugFix
相当于:git fetch origin bar~1:bugFix; git merge bugFix
- 远端:本地