人总会有犯错的时候,值得感激的是Git容许你在任什么时候候反悔,而且将对应信息从历史记录中抹除,这样的历史记录每每看起来行云流水,使人赏心悦目,严谨的提交信息是对他人的一种尊重。git
git commit --amend
若是你想改变上一个commit的提交信息与文件内容,便可使用--amend命令,它容许你将暂存区的修改合并到上一个commit,从而生成一个新的commit,您也能够仅适用它来修改commit message。shell
须要注意的是,若是已经将commit到远程库,不建议使用ammend命令,由于这样会修改掉最近一次commit的hash值,只能强制推送才能push上去,若是你的commit已经同步到了其余仓库或别人已经拉取以前的提交,这样强推上去就会产生冲突。this
git revert [<commit>]
若当某一次的提交内容致使一些错误发生,一般会进行还原操做,此时revert就派上用场了,它会生成一条新的commit,将指定的commit中包含的更改进行还原。3d
revert是一个十分礼貌的命令,对于多人协做的项目来说,是十分有用的,由于它会保持HEAD指针在不断的前进,不会产生意想不到的冲突。指针
git rebase -i [<start_commit>] [<end_commit>]
在推送到远程分以前,为了保持逻辑清晰可回溯步骤,咱们须要会进行许多个小的提交,而到推送到远程库的时候,更但愿将其汇总为一个feat提交,这时命令就派上了用场。rest
首先咱们来初始化一个git仓库:code
mkdir gittest && cd gittest && git init touch a && git add * && git commit -m 'a' touch b && git add * && git commit -m 'b' touch c && git add * && git commit -m 'c' touch d && git add * && git commit -m 'd'
这时执行git log
可获取到如下信息:排序
commit b9843274e87455a87b16802ebb2b48cf8cb67175 (HEAD -> master) d commit dc681aadc81491c3d2b2cb2f8ca1d66586f65903 c commit db9dc842b6c854b7175c03c7fd50bf08a262cfcb b commit 3bc7dbe4ddfad85606e6dd39c6583d8fa7b353b7 a
为了将b、c合成为一个提交,咱们须要选取最近3个提交进行才行,须要注意的是指定两个commit范围时区间为前开后闭区间(]
,若是省略第二个end_commit则会指向HEAD指针,所以如下三个命令是等效的:索引
git rebase -i HEAD~3
git rebase -i 3bc7dbe4ddfad85606e6dd39c6583d8fa7b353b7
git rebase -i 3bc7dbe4ddfad85606e6dd39c6583d8fa7b353b7 b9843274e87455a87b16802ebb2b48cf8cb67175
这时会弹出一个交互界面:rem
pick 3a13544 b pick 3b3d704 c pick 9205e1b d # Rebase 97b2217..9205e1b onto 97b2217 (3 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out
注释里已经包含了一切你须要知道的信息,在这里仍是简单的描述下:
a -> c -> b -> d
命令有如下不一样的模式:
在选取范围时,咱们每每会指定一个start_commit,那么若是commit为第一个提交呢?由于命令为前开区间,这时候就没法选取了,只能经过--root指定:git rebase -i --root
。
以上命令尽可能都本身尝试一遍。
git reset [<mode>] [<commit>]
首先应该理清HEAD、暂存区、工做区三者的关系再去使用reset
命令。使用reset回退版本一般是经过移动HEAD指针的指向来实现的,HEAD是当前分支引用的指针,它老是指向该分支上的最后一次提交。当HEAD指针发生变化时,有几种模式能够选择:
--soft
,暂存区与工做区都不会重置,只会重置掉提交。此模式不改变暂存区与工做区的文件内容,仅仅是将HEAD指针位置边了,这样全部在reset指定的提交以后的提交都会被撤销,文件更改集中放在了暂存区。--mixed
,重置暂存区,但不会重置工做区。reset会用HEAD指向的快照去更新暂存区的内容,只保留工做区的文件,简单的说,回到了git add
以前。--hard
,同时重置暂存区和工做区。它会完全弃用以后的提交,且不可撤销。文章只是涉及一些浅显的用法,但愿在玩转重写Git时,您也应该掌握:
git reflog
随时对进行的操做进行撤销。以上只是抛砖引玉,最重要的是能知道本身在作什么,清楚操做带来的影响。