04 時間機穿梭 版本回退

2021-09-01 20:01:51 字數 3709 閱讀 7491

03節的時候我們已經成功地新增並提交了乙個readme.txt檔案,現在,我們繼續修改readme.txt檔案。執行git status命令看看結果:

$ git status

on branch master

changes not staged for commit:

(use "git add ..." to update what will be committed)

(use "git checkout -- ..." to discard changes in working directory)

modified: readme.txt

untracked files:

(use "git add ..." to include in what will be committed)

.classpath

.project

.settings/

bin/

src/

no changes added to commit (use "git add" and/or "git commit -a")

git status命令可以讓我們時刻掌握倉庫當前的狀態,上面的命令輸出告訴我們,readme.txt被修改過了,但還沒有準備提交的修改。untracked files列出還沒有跟蹤的檔案。

雖然git告訴我們readme.txt被修改了,但如果能看看具體修改了什麼內容,自然是很好的。比如你休假兩周從國外回來,第一天上班時,已經記不清上次怎麼修改的readme.txt,所以,需要用git diff這個命令看看:

圖中可看到很多亂碼,這是readme.txt編碼問題,可以用notepad++等工具把它變成utf8,這時可以看到:

知道了對readme.txt作了什麼修改後,再把它提交到倉庫就放心多了,提交修改和提交新檔案是一樣的兩步,第一步是git add readme.txt

執行完之後再執行git status,便可看到:

$ git status

on branch master

changes to be committed:

(use "git reset head ..." to unstage)

modified: readme.txt

此時可以看到readme.txt檔案在待提交中,第二步是git commit -m ***x。這是正常的提交,但有時候我們會不小心刪錯了檔案或改壞了檔案,此時,我們還是可以恢復到修改前的某個commit狀態的,首先通過git log命令檢視提交的歷史。

$ git log

commit cd7519f910527bea01181226d83bd59c03d9e159 (head -> master)

author: wudiyong <[email protected]>

date: sun nov 25 15:18:40 2018 +0800

第6次提交

commit 425a952a81acf2e2bd549b40519af3be021debf0

author: wudiyong <[email protected]>

date: sun nov 25 15:17:47 2018 +0800

第5次提交

首先,git必須知道當前版本是哪個版本,在git中,用head表示當前版本,也就是最新的提交cd7519f910527bea01181226d83bd59c03d9e159 

上乙個版本就是head^,上上乙個版本就是head^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成head~100

注意,這裡是本地版本庫(本地倉庫)的回退,並不是工作區修改撤銷,也不是遠端倉庫的回退。假設我們要把本地倉庫從第6次提交回退到第5次提交,則可以執行git reset --hard head^命令,執行該命令後,head便指向第5次提交的位置,工作區的內容也恢復到第5次提交的內容。如果執行git reset --hard head,則head指向位置不變,但工作區還是會恢復到head指向的位置內容。我們還可以繼續執行git reset --hard head^繼續往前回退。

回退到第5次提交後,再執行git log命令檢視提交歷史,此時第6次提交的記錄已經不在了,假如我們回退錯了,想恢復到第6次提交,怎麼辦?

如果命令視窗還沒關掉的話,可以往前滾,找到第6次提交的id,也就是cd7519f910527bea01181226d83bd59c03d9e159,

然後執行命令:git reset --hard cd7519f

版本號沒必要寫全,前幾位就可以了,git會自動去找。當然也不能只寫前一兩位,因為git可能會找到多個版本號,就無法確定是哪乙個了。此時第6次提交的內容又回來了。

假如視窗已經關了,找不到要恢復的提交的id,這種情況也是可以恢復的,git提供了乙個命令git reflog用來記錄你的每一次命令,裡面可以看到每一次操作的記錄:

$ git reflog

425a952 (head -> master) head@: reset: moving to head^

cd7519f head@: reset: moving to cd7519f91

425a952 (head -> master) head@: reset: moving to head

425a952 (head -> master) head@: reset: moving to head^

cd7519f head@: reset: moving to head

cd7519f head@: reset: moving to head

cd7519f head@: reset: moving to head

cd7519f head@: commit: 第6次提交

425a952 (head -> master) head@: commit: 第5次提交

3b985ac head@: commit: xsss

a597a2e head@: commit: ***xx

2f8dd17 head@: commit (initial): 首次提交

$ git push

fatal: no configured push destination.

either specify the url from the command-line or configure a remote repository using

git remote add and then push using the remote name

git push

Git 時光機穿梭之版本回退

現在,你已經學會了修改檔案,然後把修改提交到git版本庫,現在,再練習一次,修改readme.txt檔案如下 git is a distributed version control system.git is free software distributed under the gpl.然後嘗試...

06 時間機穿梭 撤銷修改

為什麼git比其他版本控制系統設計得優秀,因為git跟蹤並管理的是修改,而非檔案,比如你修改了乙個檔案,然後用git add把它加到暫存區,然後再一次修改這個檔案,然後用git commit命令提交到某個分支,此時你再用git status命令能看到第二次修改並沒有提交,甚至都還沒到暫存區,因為gi...

07 時間機穿梭 刪除檔案

假如我們在檔案系統中把乙個檔案test.txt刪掉,執行git stauts可以看到 git status on branch master changes not staged for commit use git add rm to update what will be committed u...