Git:本地仓库管理
-
git log
:查看 commit 提交历史 -
git log --pretty=oneline
:简化log输出内容 -
git reflog
:查看每一次命令的历史记录
版本回退
-
git reset HEAD/HEAD^/...
:重置当前分支的HEAD为指定commit,同时重置暂存区,但工作区不变 -
git reset --hard HEAD/HEAD^/...
:重置当前分支的HEAD为指定commit,同时重置暂存区和工作区 -
git reset --keep HEAD/HEAD^/...
:重置当前分支的HEAD为指定commit,同时保持暂存区和工作区不变
┌────┐
│HEAD│
└────┘
│
│ ○ append GPL
│ │
└──> ○ add distributed
│
○ wrote a readme file
若要版本回退,首先Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
每次commit用一串哈希值标识,选择时不需要填入全部,只要能区分就行
$ git log --pretty=oneline
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
e475afc93c209a690c39c13a46716e8fa000c366 add distributed
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
$ git reset --hard HEAD^
HEAD is now at e475afc add distributed
$ git log --pretty=oneline
e475afc93c209a690c39c13a46716e8fa000c366 add distributed
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
最新的那个版本append GPL
已经看不到了!
版本回退之后的后悔药
┌────┐
│HEAD│
└────┘
│
└──> ○ commit id ???
|
○ add distributed
│
○ wrote a readme file
若要再回去:
- 未关机:直接翻看之前append GPL版本的
commit id
- 重启了:
git reflog
用来记录了你的每一次命令
$ git reset --hard 1094a
HEAD is now at 83b0afe append GPL
现在又回到append GPL版本了!
检出
checkout用于切换分支或恢复工作区,注意它会覆盖文件(危险)
-
git checkout
:列出暂存区可以被检出的文件 -
git checkout file
:从暂存区检出文件到工作区,覆盖工作区内容,但不清除暂存区 -
git checkout .
:检出暂存区的所有文件到工作区 -
git checkout [HEAD/HEAD^ ... ] file
:检出某个 commit 的指定文件到暂存区和工作区 -
git checkout [HEAD/HEAD^ ... ] .
:检出某个 commit 的所有文件到暂存区和工作区
示例:使用检出撤销修改
① 当修改没有添加到暂存区:
- 直接在工作区改回来
- 使用
git checkout file
丢弃工作区的修改(或已经添加到暂存区文件后又修改了没添加)
② 当修改已经添加到暂存区:
-
撤销暂存区的修改:
git reset HEAD <file>
(git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。使用HEAD
表示最新的版本。) -
撤销修改后,再丢弃工作区的修改:
git checkout file
③ 当修改已经提交到版本库,那就版本回退:
$ git reset --hard HEAD^
④ 当修改已经推送到远程版本库:GG!
移动和删除
-
git mv src dest
:移动文件(移动到当前目录可用于改名) -
git rm file
:同时删除版本库和工作目录中的文件 -
git rm --cached file
:从版本库中删除,但不删除工作目录中的文件
以上改动后不需要add,但必须 commit 后才改动版本库内容
示例:
情景一:已从工作区中删除,且需要从版本库同步删除行为
$ git rm/add test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
情景二:工作区中误删了,从版本库中恢复误删的文件(也就是撤销工作区的修改)
git checkout -- test.txt
情景三:同时删除版本库和工作区中的文件
git rm .\test.txt
git commit -m "delete test.txt"