git 学习
gitBranchAndCommit
学到的命令:
-
使用
git branch -a
查看当前 repo 中有哪些 branch; -
使用
git checkout xxx
将当前分支切换到 xxx branch,使用git checkout -b yyy
可以基于当前分支新建 yyy 分支并切换,使用git checkout -b <branch name> <SHA1>
新建一个 branch 指向 <SHA1> 所在 commit; -
使用
git status
查看当前 "工作区 working diretory" 中有哪些文件产生了变更; -
使用
git add xxx
将 "工作区“ 中xxx
加入到 "变更区" 中; -
使用
git commit -m "Commit describe"
将 "变更区" 中的变更提交成一个 commit,并对该 commit 做一些合适的描述; -
使用
git push
将当前分支的变更 push 到你的 Repo; -
使用
git log
查看当前 Git Commit 历史; -
使用
git reset --hard HEAD~n
回退 HEAD 指针 n 个版本,特别的,回退到上个版本可以使用HEAD^
; -
使用
git push --force
来强制 push。注意:若当该 branch 涉及到于他人合作的部分,不要强制 push。
遇到的问题:
Copy the main branch only
,顾名思义,如果要 clone 整个结构就不要选;git branch -a
得到的结果,remotes
代表托管的服务器,origin
是git clone
的时候创建的临时仓库,表示来源的意思,所以在这两个字段后面的内容才是分支的名字(遇到HEAD detached
,试了半小时,结果发现是这里的问题);
出现了的问题:HEAD detached at origin/branch_Name
,解决办法:重来。HEAD detached
是指HEAD
没有指向分支,因此不能git push
;- Repo 本地的当前分支和远端分支并不是父子关系的时候,直接
git push
会报错! [rejected]
。
gitStash
核心:git stash
。
作用:无法完成完整的 commit 时临时更换工作区,可使用 git stash
将改动暂存,以切换到其他分支进行正常地操作。
学到的命令:
- 使用
git stash save "unfinished feature1"
将 "工作区" 中的改动暂存到栈中; - 使用
git stash list
查看现在存储了多少 "暂存变更"; - 使用
git stash apply stash@{X}
,其中X
是一个数字,代表你要恢复的 "暂存变更" 的索引,在第 2 步中应该已看到。
遇到的问题:
- 貌似没有
git stash
而直接切换分支并没有出现问题,没有进行后续操作,回来研究研究。
gitMergeAndRebase
A---B---C my-feature-1
/
---D---E---F master-1
A---B---C my-feature-2
/
---D---E---F master-2
A---B---C my-feature-3
/
---D---E---F master-3
-
在
master-1
分支上合并my-feature-1
分支(解决该解决的冲突,保留该保留的代码),并产生一个合并提交G
:切换到
my-feature-1
分支上查看 commit,然后切换到master-1
分支直接使用git merge 07...d2
,会得到 Auto-merging 时的 CONFLICT,进入文件进行修复,然后提交成为一个 commit,最后git merge 07...d2
并 push 到仓库。得到的结构如图所示:
A---B---C my-feature-1 / \ ---D---E---F---G master-1
-
在
my-feature-2
分支上 rebasemaster-2
分支(解决该解决的冲突,保留该保留的代码):切换到
my-feature-2
上运行git rebase master-2
,然后逐个(逐个commit?)解决冲突,最后git push -f
提交。得到的结构如图所示:
D---E---F---A'---B'---C' my-feature-2 | master-2
-
将
my-feature-3
分支上的 3 个提交(A、B、C)使用merge --squash
方式(解决该解决的冲突,保留该保留的代码),使得这三个提交被合并成一个提交进入master-3
分支:类似 merge 的操作,可以直接输入分支名
git merge --squash my-feature-3
,然后手动解决冲突并提交。得到的结构如图所示:
A---B---C my-feature-3 / ---D---E---F---G master-3 | 压扁后的提交
-
将基于
my-feature
分支上面最新的三个提交压扁成一个提交:首先使用
git log
查看 commit 记录及标号,然后找到要被压缩的段的前一个,也就是D
,执行git rebase -i 4e..<commitD >..6c
,会连续两次弹出两个文件,第一个文件中pick
表示使用当前 commit,squash
表示会压缩到前一个 commit。第二个文件是合并后 commit 的表述。压扁前:
---D---E---F---G my-feature
压扁后:
---D---H my-feature | 压扁后的提交