要把文檔還原到編輯前的狀態,大家都是怎麼做的呢?
最簡單的方法就是先備份編輯前的文檔。使用這個方法時,我們通常都會在備份的文檔名或目錄名上添加編輯的日期。但是,每次編輯文檔都要事先複製,這樣非常麻煩,也很容易出錯。
再加上,如果像上圖那樣毫無命名規則的話,就無法區分哪一個文檔是最新的了。而且,如果是共享文件的話,應該加上編輯者的名字。還有,那些文檔名字沒有體現修改內容。
另外,如果兩個人同時編輯某個共享文件,先進行編輯的人所做的修改內容會被覆蓋,相信大家都有這樣的經歷。
Git版本管理系統就是為了解決這些問題應運而生的。
使用Git進行版本管理Git是一個分布式版本管理系統,是為了更好地管理Linux內核開發而創立的。
Git可以在任何時間點,把文檔的狀態作為更新記錄保存起來。因此可以把編輯過的文檔復原到以前的狀態,也可以顯示編輯前後的內容差異。
而且,編輯舊文件後,試圖覆蓋較新的文件的時候(即上傳文件到伺服器時),系統會發出警告,因此可以避免在無意中覆蓋了他人的編輯內容。
用Git管理文件的話,更新的歷史會保存在Git,所以,不需要備份文件,非常的方便。安裝Git
首先下載你的系統的Git客戶端
Git下載地址
這裡以Windows舉例, 下載之後, 雙擊安裝即可
安裝完成之後請執行 version命令,如果顯示Git的版本就說明安裝成功了。
git --version管理歷史記錄的倉庫倉庫 (Repository)是記錄文件或目錄狀態的地方,存儲著內容修改的歷史記錄。在倉庫的管理下,把文件和目錄修改的歷史記錄放在對應的目錄下。
遠程倉庫和本地倉庫
首先,Git的倉庫分為遠程倉庫和本地倉庫的兩種。
遠程倉庫:
配有專用的伺服器,為了多人共享而建立的倉庫。
本地倉庫:
為了方便用戶個人使用,在自己的機器上配置的倉庫。
倉庫分為遠程和本地兩種。平時用手頭上的機器在本地倉庫上操作就可以了。如果想要公開在本地倉庫中修改的內容,把內容上傳到遠程倉庫就可以了。另外,通過遠程倉庫還可以取得其他人修改的內容。
創建倉庫
創建本地倉庫的方法有兩種:一種是創建全新的倉庫,另一種是複製遠程倉庫。
接下來要在本地新建倉庫,創建一個名稱為「demo」的空目錄,並把它放在Git管理之下。
下面將以這個目錄進行教程講解。
首先在任意一個地方創建demo目錄。然後使用init命令把該demo目錄移動到本地Git倉庫。
按照以下步驟把新創建的demo目錄設置到Git倉庫
桌面空白處右鍵打開 Git Bash, 執行命令:(git命令與linux命令基本相同)
$ mkdir demo
$ cd demo
$ git init工作樹和索引在Git管理下,大家實際操作的目錄被稱為工作樹。
在倉庫和工作樹之間有索引,索引是為了向倉庫提交作準備的區域。
Git在執行提交的時候,不是直接將工作樹的狀態保存到倉庫,而是將設置在中間索引區域的狀態保存到倉庫。因此,要提交文件,首先需要把文件加入到索引區域中。
所以,憑藉中間的索引,可以避免工作樹中不必要的文件提交,還可以將文件修改內容的一部分加入索引區域並提交。
一些開始的設定安裝Git之後,請輸入您的用戶名和電子郵件地址。該設置操作在安裝Git後進行一次就夠了。這些信息將作為提交者信息顯示在更新歷史中。
Git的設定被存放在當前登陸用戶目錄的.gitconfig檔案裡。雖然可以直接編輯配置文件,但在這個教程裡我們使用config命令。
受國內網絡影響, Github 訪問並不是很理想, 這裡使用國內的遠程git倉庫 ,註冊 碼雲 倉庫帳號
$ git config --global user.name "你的用戶名"
$ git config --global user.email "你的電子郵件"提交文件在demo目錄新建一個文件,然後將文件添加到倉庫。
首先在demo目錄裡新建一個名為「a.txt」的文本文件,請在文件中輸入以下的內容:
學習Git請使用status命令確認工作樹和索引的狀態。
$ git status執行status命令以確認demo目錄的狀態。
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# a.txt
nothing added to commit but untracked files present (use "git add" to track)從status響應我們可以看到a.txt目前不是歷史記錄對象。請首先把a.txt這個文件加入到索引,就可以追蹤它的變更了。
現在,我們把a.txt加入到索引然後確認一下。
$ git add a.txt
查看狀態
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: a.txt
#將文件加入到索引,要使用add命令。在<file>指定加入索引的文件。用空格分割可以指定多個文件。
$ git add <file>..指定參數「./」,可以把所有的文件加入到索引。
$ git add ./
既然a.txt已加入到索引,我們就可以提交文件了。
請執行如下顯示的commit命令(為之前添加的a.txt添加上傳描述)。
$ git commit -m "first commint"-m 參數為提交的說明, 建議不為空
執行commit命令之後確認狀態。
# 剛才添加的命令
$ git commit -m "first commit"
[master (root-commit) 116a286] first commit
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 a.txt
# 查看狀態
$ git status
# On branch master
nothing to commit (working directory clean)從status響應我們可以看到沒有新的變更要提交。
使用log命令,我們可以在倉庫的提交記錄看到新的提交。
$ git logpush到遠程倉庫前面我們為大家介紹了本地倉庫的基本使用方法。下面,我們接著為大家講解如何在遠程倉庫上共享本地倉庫的修改記錄。
推送為了將本地倉庫的修改記錄共享到遠程倉庫,必須上傳本地倉庫中存儲的修改記錄。
為此,需要在Git執行推送(Push)操作。執行Push之後,本地的修改記錄會被上傳到遠程倉庫。所以遠程倉庫的修改記錄就會和本地倉庫的修改記錄保持同步。
建立遠程倉庫受國內網絡影響, Github 訪問並不是很理想, 這裡使用國內的遠程倉庫
註冊 碼雲 帳號, 並創建一個倉庫, 名字為 demo:
輸入名字後,可以直接提交。
添加成功之後, 這裡可以看遠程倉庫的地址:
推送到遠程倉庫
我們試試推送在之前創建的本地倉庫吧。
向遠程倉庫推送本地倉庫的修改記錄吧。
您可以給遠程倉庫取一個別名。這樣,下次推送的時候就不需要輸入長串的遠程倉庫地址了。在這個教程裡,我們的遠程倉庫命名為「origin」。
請使用remote指令添加遠程倉庫。輸入遠程倉庫名稱,指定遠程倉庫的URL。
$ git remote add 你的倉庫名 你的倉庫url地址通過運行以下指令,將創建於上一個頁面的遠程倉庫的URL命名為「origin」。
$ git remote add origin https://gitee.com/12356/demo.giturl 可以在遠程倉庫的控制面板獲取
執行推送或者拉取的時候,如果省略了遠程倉庫的名稱,則默認使用名為」origin「的遠程倉庫。因此一般都會把遠程倉庫命名為origin。
使用push命令向倉庫推送更改內容。
輸入目標地址,指定推送的分支(我們將在高級篇詳細地對分支進行說明。):
$ git push <庫名> <分支>...運行以下命令便可向遠程倉庫『origin』進行推送。當執行命令時,如果您指定了-u選項,那麼下一次推送時就可以省略分支名稱了。但是,首次運行指令向空的遠程倉庫推送時,必須指定遠程倉庫名稱和分支名稱。
當被要求輸入用戶名和密碼,請使用您的碼雲的用戶名和密碼。
$ git push -u origin master
Username: <用戶名>
Password: <密碼>
Counting objects: 3, done.
Writing objects: 100% (3/3), 245 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://gitee.com/123123/demo.git
* [new branch] master -> master如果使用公鑰認證, 就不用再輸入密碼了, 高級篇會講到
請打開碼雲的Git頁面。刷新頁面就可以看到剛剛推送到遠程倉庫的項目。
為什麼要克隆如果遠程倉庫中有他人的修改記錄,那麼把它完整地複製下來您就可以接著進行工作了。
或者您要在別人的基礎上, 繼續開發項目, 都可以從遠程倉庫克隆一份代碼到本地
進行克隆(Clone)操作就可以複製遠程倉庫。
執行克隆後,遠程倉庫的全部內容都會被下載。之後您在另一臺機器的本地倉庫上進行操作。
克隆後的本地倉庫的變更履歷也會被複製,所以可以像原始的倉庫一樣進行查看記錄或其他操作。
開始克隆假設您是其中一位團隊成員,把現有的遠程倉庫克隆到另一個目錄( demo2 )。
使用clone指令可以複製倉庫,在<repository>指定遠程倉庫的URL,在<directory>指定新目錄的名稱。
$ git clone <repository> <directory>執行以下指令後,會在目錄(demo2) 複製遠程倉庫。
$ git clone https://gitee.com/123123/demo.git demo2
Cloning into 'demo2'...
Username: <用戶名>
Password: <密碼>
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.若要驗證克隆是否成功,請看在複製的目錄「demo2」中的a.txt是否含有以下文字。
學習Git從克隆的倉庫進行pushcd到demo2進行的操作
首先,在克隆的倉庫目錄裡的a.txt文件裡添加一行文字(方便我們辨認),並保存。
學習Git
add 把變更錄入到索引中添加到索引區, 並提交到本地倉庫:
$ git add a.txt
$ git commit -m "添加add的說明"
[master 1ef5c8c] 添加add的說明
1 files changed, 1 insertions(+), 1 deletions(-)然後,推送此次變更,更新遠程倉庫。
當在克隆的倉庫目錄執行推送時,您可以省略倉庫和分支名稱。
$ git push
Username: <用戶名>
Password: <密碼>
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 351 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://gitee.com/liuwantao/demo.git
486789c..1ef5c8c master -> master訪問碼雲 demo 倉庫的首頁, 刷新頁面就可以看到推送的更新
從遠程倉庫pull若是共享的遠程倉庫由多人同時作業,那麼作業完畢後所有人都要把修改的內容推送到遠程倉庫。然後,自己的本地倉庫也需要更新其他人推送的變更內容。
pull進行拉取(Pull) 操作就可以把遠程倉庫的內容更新到本地倉庫。
進行拉取(Pull) 操作,就是從遠程倉庫下載最近的變更日誌,並覆蓋自己本地倉庫的相關內容。
我們把在上一節中從「demo2」推送到遠程倉庫的內容拉取到倉庫目錄「demo」吧。
使用pull指令進行拉取操作。省略倉庫名稱的話,會在名為origin的倉庫進行pull。
命令格式:
$ git pull <庫名> <分支名>...用demo進行的操作
cd到一開始的demo目錄,執行以下指令:
$ git pull origin master
Username: <用戶名>
Password: <密碼>
From https://gitee.com/liuwantao/demo.git
* branch master -> FETCH_HEAD
Updating ac56e47..3da09c1
Fast-forward
a.txt | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)a.txt文檔的內容已更新。
合併修改記錄
在執行pull之後,進行下一次push之前,如果其他人進行了推送內容到遠程倉庫的話,那麼你的push將被拒絕。
這種情況下,在讀取別人push的變更並進行合併操作之前,你的push都將被拒絕。這是因為,如果不進行合併就試圖覆蓋已有的變更記錄的話,其他人push的變更(圖中的提交C)就會丟失。
合併的時候,Git會自動合併已有的變更點!不過,也存在不能自動合併的情況。在下一節頁面,我們會為大家介紹手動合併的方法!這一節, 先看一下衝突的情況
push衝突的狀態現在,我們將要學習怎樣解決衝突。首先,我們用「demo」和「demo2」製造一個衝突狀態。
用demo2進行的操作
接下來,打開demo2目錄的a.txt文檔,添加一行文字之後進行提交。
學習Git
add 把變更錄入到索引中
pull 取得遠端倉庫的內容$ git add a.txt
$ git commit -m "添加pull的說明"
[master 4c01823] 添加pull的說明
1 files changed, 1 insertions(+), 0 deletions(-)現在從demo2 推送內容到遠程倉庫。
$ git push
Username: <用戶名>
Password: <密碼>
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 391 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://gitee.com/liuwantao/demo.git
3da09c1..4c01823 master -> master在目前的遠程倉庫,"a.txt"文檔已包含第三行內容「pull 取得遠端倉庫的內容」,並且已被存儲到歷史記錄中啦。
用demo進行的操作
首先,打開demo目錄的a.txt文檔,添加一行文字之後進行提交。
學習Git
add 把變更錄入到索引中
commit 記錄索引的狀態$ git add a.txt
$ git commit -m "添加commit的說明"
[master 95f15c9] 添加commit的說明
1 files changed, 1 insertions(+), 0 deletions(-)現在從demo推送內容到遠程倉庫吧。
$ git push
Username: <用戶名>
Password: <密碼>
To https://gitee.com/liuwantao/demo.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'https://gitee.com/liuwantao/demo.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again. See the
'Note about fast-forwards' section of 'git push --help' for details.看到吧,發生了錯誤,推送被拒絕(rejected)了。
下一節, 來看一下如何解決衝突吧
解決衝突在上一個節我們提及到,執行合併即可自動合併Git修改的部分。但是,也存在無法自動合併的情況。
如果遠程倉庫和本地倉庫的同一個地方都發生了修改的情況下,因為無法自動判斷要選用哪一個修改,所以就會發生衝突。
Git會在發生衝突的地方修改文件的內容,如下圖。所以我們需要手動修正衝突。
==分割線上方是本地倉庫的內容,下方是遠程倉庫的編輯內容。
如下圖所示,修正所有衝突的地方之後,執行提交。
解決demo與demo2的衝突
用demo進行的操作
cd在demo執行以下指令,讓git修改我們的衝突文件 (a.txt)。
$ git pull origin master
Username: <用戶名>
Password: <密碼>
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://gitee.com/liuwantao/demo.git
* branch master -> FETCH_HEAD
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.顯示合併時發生衝突的訊息。
訊息顯示「Merge conflict in a.txt」。我們看到Git已添加標示以顯示衝突部分。請為Git無法完成主動合併的部分做以下的修改。
打開a.txt:
## 衝突情況
學習Git
add 把變更錄入到索引中
<<<<<<< HEAD
commit 記錄索引的狀態
=======
pull 取得遠端倉庫的內容
>>>>>>> 4c0182374230cd6eaa93b30049ef2386264fe12a導入兩方的修改,並刪除多餘的標示行以解決衝突。
## 修改後的
學習Git
add 把變更錄入到索引中
commit 記錄索引的狀態
pull 取得遠端倉庫的內容文件的內容發生了修改,所以需要進行提交。
$ git add a.txt
$ git commit -m "合併"
[master d845b81] 合併這樣就完成了從遠程倉庫導入最新的修改內容。
我們可以用log命令來確認倉庫的歷史記錄是否準確。指定--graph選項,能以文本形式顯示更新記錄的流程圖。指定--oneline選項,能在一行中顯示提交的信息。
$ git log --graph --oneline
* d845b81 合併
|\
| * 4c01823 添加pull的說明
* | 95f15c9 添加commit的說明
|/
* 3da09c1 添加add的說明
* ac56e47 first commit這表明兩個修改記錄已經整合了。
這時候,之前被拒絕的push應該可以通過了,push一下看看吧。