Skip to content

Git 相关

本文是否适合你

请尝试回答以下三个问题

  • Commit 的时候提示 *** Please tell me who you are. 应该怎么办?
  • pull 和 push 都是啥?
  • .gitignore 是干啥的?

如果你无法回答,请先阅读 https://training.github.com/downloads/zh_CN/github-git-cheat-sheet/ 以及 https://github.com/git/git/blob/master/Documentation/giteveryday.txt。这将会使你入门 Git 的基本使用。

如果在 TOC 找不到完全对应你问题的解答

修改一个提交的内容

这可能包括修改的文件、Commit 信息、签名等等。

这是最近的一个提交,不保留

commit 有一个 --amend 选项,相当于撤销 HEAD 对应的 commit,然后重新 commit。

> git add files/to/change
> git commit --amend
# You can change commit message too!

这不是最近的一个提交,不保留这一提交

git 拥有一个子命令 rebase 用于修改较深的历史。常用于从历史中删除不小心添加进去的秘钥、修复本地分支和 Upstream 的分叉(将本地分支“移植”到 Upstream 指向的最新 Commit 上,因此得名 rebase),以及,删除某一个特定的历史中的提交。

See: git rebase

推荐的使用方法是在 vim / Emacs 作为默认编辑器 (core.editor) 时,使用 git rebase -i [THE COMMIT HASH]

您想保留之前的提交

See: git revert

这会产生一个 "Reverted: xxx" 的新提交,内容是给定提交的逆。

在 push 或者 commit 之前进行特定检查,类似 CI

See: hooks

最常用的是 pre-commitpre-push。非零返回值会打断 commit 或者 push

将本地 A 分支推至 remote 的 B 分支

错误地在本地的 A 分支上进行了提交

你希望在分支 jiegetql 进行数次 commit,但是忽然发现你其实一直在 master 上操作。

# 首先,将本地的 jiegetql 分支同步到和本地 master 的相同位置
[  master] > git checkout jiegetql
[jiegetql] > git reset --hard master
# Alternately: git merge --ff-only master

# 接下来,将 master 强制安排到和云端的 master 同样地地方
[jiegetql] > git checkout master
[  master] > git fetch --all
[  master] > git reset --hard origin/master

A 上的提交是正确的,只是想推到另一个名字的分支上

你想直接用本地的 dirty 分支推到 remote meow 上的 kawaii 分支。

[dirty] > git push meow dirty:kawaii

See: Refspec

需要删除云端的分支 / Tag

分支

你想删除 remote meow 上面的 kawaii 分支。

> git push meow :kawaii
# Alternately: git push --delete meow kawaii

如果你很感兴趣 :kawaii 是什么意思,请仔细阅读 Git Book 的 Refspec 一节

Tag

你想删除 remote meow 上面的 kawaii Tag。

> git push meow :refs/tags/kawaii

错误的分支删除 / reset,需要找回之前的 commit hash

只要没有执行过 git gc,git 不会主动清理对象,即使没有任何的指针指向它。git reflog 会打印出最近 git 操作所改变的各种 Hash,可以据此加上 git reset --hard 或者 git checkout + git branch 恢复之前的 commit。

See: git reflog