对于第一次解除github的小白来说,如何正确使用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 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
;- 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
分支上rebase master-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 | 压扁后的提交
数据来源:qiqi的git小窝
Comments | NOTHING