1.取消已經(jīng)暫存的文件
????接下來的兩個小節(jié)將演示如何取消暫存區(qū)域中的文件,以及如何取消工作目錄中已修改的文件。不用擔(dān)心,查看文件狀態(tài)的時候就提示了該如何撤消,所以不需要死記硬背。來看下面的例子,有兩個修改過的文件,我們想要分開提交,但不小心用 git add .全加到了暫存區(qū)域。該如何撤消暫存其中的一個文件呢?其實,git status 的命令輸出已經(jīng)告訴了我們該怎么做:
$ git add .
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README.txt
modified: benchmarks.rb
就在 “Changes to be committed” 下面,括號中有提示,可以使用 git reset HEAD <file>...的方式取消暫存。好吧,我們來試試取消暫存 benchmarks.rb 文件:
$ git reset HEAD benchmarks.rb
Unstaged changes after reset:
M benchmarks.rb
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: benchmarks.rb
2.取消對文件的修改
????如果覺得剛才對 benchmarks.rb 的修改完全沒有必要,該如何取消修改,回到之前的狀態(tài)(也就是修改之前的版本)呢?git status 同樣提示了具體的撤消方法,接著上面的例子,現(xiàn)在未暫存區(qū)域看起來像這樣:
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: benchmarks.rb
????在第二個括號中,我們看到了拋棄文件修改的命令(至少在 Git 1.6.1 以及更高版本中會這樣提示,如果你還在用老版本,我們強烈建議你升級,以獲取最佳的用戶體驗),讓我們試試看:
$ git checkout -- benchmarks.rb
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README.txt
????可以看到,該文件已經(jīng)恢復(fù)到修改前的版本。你可能已經(jīng)意識到了,這條命令有些危險,所有對文件的修改都沒有了,因為我們剛剛把之前版本的文件復(fù)制過來重寫了此文件。所以在用這條命令前,請務(wù)必確定真的不再需要保留剛才的修改。如果只是想回退版本,同時保留剛才的修改以便將來繼續(xù)工作,可以用下章介紹的 stashing 和分支來處理,應(yīng)該會更好些。
????記住,任何已經(jīng)提交到 Git 的都可以被恢復(fù)。即便在已經(jīng)刪除的分支中的提交,或者用 --amend 重新改寫的提交,都可以被恢復(fù)。所以,你可能失去的數(shù)據(jù),僅限于沒有提交過的,對 Git 來說它們就像從未存在過一樣。
3.強制覆蓋本地倉庫
????在使用Git的過程中,有些時候我們只想要git服務(wù)器中的最新版本的項目,對于本地的項目中修改不做任何理會,就需要用到Git pull的強制覆蓋,具體代碼如下:
$ git fetch --all
$ git reset --hard origin/master
$ git pull
git fetch 只是下載遠程的庫的內(nèi)容,不做任何的合并
git reset 把HEAD指向剛剛下載的最新的版本
4.解決文件沖突
方法① git pull --rebase
git pull --rebase
方法② git stash
- 先將本地修改存儲起來
$ git stash
????這樣本地的所有修改就都被暫時存儲起來 。用git stash list可以看到保存的信息。其中stash@{0}就是剛才保存的標(biāo)記。
- 暫存了本地修改之后,就可以pull了。
$ git pull
- 還原暫存的內(nèi)容
$ git stash pop stash@{0}
系統(tǒng)提示如下類似的信息:
Auto-merging c/environ.c
CONFLICT (content): Merge conflict in c/environ.c
意思就是系統(tǒng)自動合并修改的內(nèi)容,但是其中有沖突,需要解決其中的沖突。
- 解決文件中沖突的的部分
打開沖突的文件,會看到類似如下的內(nèi)容:
git沖突內(nèi)容
其中Updated upstream 和=====之間的內(nèi)容就是pull下來的內(nèi)容,====和stashed changes之間的內(nèi)容就是本地修改的內(nèi)容。碰到這種情況,git也不知道哪行內(nèi)容是需要的,所以要自行確定需要的內(nèi)容。
解決完成之后,就可以正常的提交了。
git add .
git commit -m "注釋"
git push -u origin master