学到的命令:
使用 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 HEAD~n
回退 HEAD 指针 n 个版本,特别的,回退到上个版本可以使用 HEAD^
;
--hard
:撤销 工作区 中所有未提交的修改内容,将 暂存区 与 工作区 都回到上一次版本,并 删除 之前的所有信息提交(谨慎使用);--mixed
:(默认为该选项)重置 暂存区 的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变;--soft
:回退到某个版本,内容放在暂存区。使用 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
;git push
会报错 ! [rejected]
。核心:git stash
。
作用:无法完成完整的 commit 时临时更换工作区,可使用 git stash
将改动暂存,以切换到其他分支进行正常地操作。
学到的命令:
git stash save "unfinished feature1"
将 "工作区" 中的改动暂存到栈中;git stash list
查看现在存储了多少 "暂存变更";git stash apply stash@{X}
,其中 X
是一个数字,代表你要恢复的 "暂存变更" 的索引,在第 2 步中应该已看到。遇到的问题:
git stash
而直接切换分支并没有出现问题,没有进行后续操作,回来研究研究。xxxxxxxxxx
111A---B---C my-feature-1
2/
3---D---E---F master-1
4
5A---B---C my-feature-2
6/
7---D---E---F master-2
8
9A---B---C my-feature-3
10/
11---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 到仓库。
得到的结构如图所示:
xxxxxxxxxx
31A---B---C my-feature-1
2/ \
3---D---E---F---G master-1
在 my-feature-2
分支上 rebase master-2
分支(解决该解决的冲突,保留该保留的代码):
切换到 my-feature-2
上运行 git rebase master-2
,然后逐个(逐个commit?)解决冲突,最后 git push -f
提交。
得到的结构如图所示:
xxxxxxxxxx
31D---E---F---A'---B'---C' my-feature-2
2|
3master-2
将 my-feature-3
分支上的 3 个提交(A、B、C)使用 merge --squash
方式(解决该解决的冲突,保留该保留的代码),使得这三个提交被合并成一个提交进入 master-3
分支:
类似 merge 的操作,可以直接输入分支名 git merge --squash my-feature-3
,然后手动解决冲突并提交。
得到的结构如图所示:
xxxxxxxxxx
51A---B---C my-feature-3
2/
3---D---E---F---G master-3
4|
5压扁后的提交
将基于 my-feature
分支上面最新的三个提交压扁成一个提交:
首先使用 git log
查看 commit 记录及标号,然后找到要被压缩的段的前一个,也就是 D
,执行 git rebase -i 4e..<commitD >..6c
,会连续两次弹出两个文件,第一个文件中 pick
表示使用当前 commit,squash
表示会压缩到前一个 commit。第二个文件是合并后 commit 的表述。
压扁前:
xxxxxxxxxx
11---D---E---F---G my-feature
压扁后:
xxxxxxxxxx
31---D---H my-feature
2|
3压扁后的提交