←返回主页

git 学习

gitBranchAndCommit

学到的命令:

  1. 使用 git branch -a 查看当前 repo 中有哪些 branch;

  2. 使用 git checkout xxx 将当前分支切换到 xxx branch,使用 git checkout -b yyy 可以基于当前分支新建 yyy 分支并切换,使用 git checkout -b <branch name> <SHA1> 新建一个 branch 指向 <SHA1> 所在 commit;

  3. 使用 git status 查看当前 "工作区 working diretory" 中有哪些文件产生了变更;

  4. 使用 git add xxx 将 "工作区“ 中 xxx 加入到 "变更区" 中;

  5. 使用 git commit -m "Commit describe" 将 "变更区" 中的变更提交成一个 commit,并对该 commit 做一些合适的描述;

  6. 使用 git push 将当前分支的变更 push 到你的 Repo;

  7. 使用 git log 查看当前 Git Commit 历史;

  8. 使用 git reset HEAD~n 回退 HEAD 指针 n 个版本,特别的,回退到上个版本可以使用 HEAD^

    • --hard:撤销 工作区 中所有未提交的修改内容,将 暂存区工作区 都回到上一次版本,并 删除 之前的所有信息提交(谨慎使用);
    • --mixed:(默认为该选项)重置 暂存区 的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变;
    • --soft:回退到某个版本,内容放在暂存区。

    示意图

  9. 使用 git push --force 来强制 push。注意:若当该 branch 涉及到于他人合作的部分,不要强制 push

遇到的问题:

  1. Copy the main branch only,顾名思义,如果要 clone 整个结构就不要选;
  2. git branch -a 得到的结果,remotes 代表托管的服务器,origingit clone 的时候创建的临时仓库,表示来源的意思,所以在这两个字段后面的内容才是分支的名字(遇到 HEAD detached,试了半小时,结果发现是这里的问题); 出现了的问题:HEAD detached at origin/branch_Name,解决办法:重来。
  3. HEAD detached 是指 HEAD 没有指向分支,因此不能 git push
  4. Repo 本地的当前分支和远端分支并不是父子关系的时候,直接git push 会报错 ! [rejected]

gitStash

核心:git stash

作用:无法完成完整的 commit 时临时更换工作区,可使用 git stash 将改动暂存,以切换到其他分支进行正常地操作。

学到的命令:

  1. 使用 git stash save "unfinished feature1" 将 "工作区" 中的改动暂存到栈中;
  2. 使用 git stash list 查看现在存储了多少 "暂存变更";
  3. 使用 git stash apply stash@{X},其中 X 是一个数字,代表你要恢复的 "暂存变更" 的索引,在第 2 步中应该已看到。

遇到的问题:

  1. 貌似没有 git stash 而直接切换分支并没有出现问题,没有进行后续操作,回来研究研究。

gitMergeAndRebase

  1. 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 到仓库。

    得到的结构如图所示:

  2. my-feature-2 分支上 rebase master-2 分支(解决该解决的冲突,保留该保留的代码):

    切换到 my-feature-2 上运行 git rebase master-2,然后逐个(逐个commit?)解决冲突,最后 git push -f 提交。

    得到的结构如图所示:

  3. my-feature-3 分支上的 3 个提交(A、B、C)使用 merge --squash 方式(解决该解决的冲突,保留该保留的代码),使得这三个提交被合并成一个提交进入 master-3 分支:

    类似 merge 的操作,可以直接输入分支名 git merge --squash my-feature-3,然后手动解决冲突并提交。

    得到的结构如图所示:

  4. 将基于 my-feature 分支上面最新的三个提交压扁成一个提交:

    首先使用 git log 查看 commit 记录及标号,然后找到要被压缩的段的前一个,也就是 D,执行 git rebase -i 4e..<commitD >..6c,会连续两次弹出两个文件,第一个文件中 pick 表示使用当前 commit,squash 表示会压缩到前一个 commit。第二个文件是合并后 commit 的表述。

    压扁前:

    压扁后: