## Git 簡介html
Git 是一種代碼管理方式,用於多人協做開發。Git 有以下特色:vue
- 分佈存儲在多臺電腦上git
- 任意兩個開發者之間能夠很容易的解決衝突。github
- 離線工做web
Pro Git(中文版) 返回 碼雲
目錄api
返回碼雲 | Git 官方網站 | Git 手冊 | Pro Git 源碼服務器
http://git.oschina.net/progit/3-Git-%E5%88%86%E6%94%AF.html#3.4-%E5%88%A9%E7%94%A8%E5%88%86%E6%94%AF%E8%BF%9B%E8%A1%8C%E5%BC%80%E5%8F%91%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B網絡
1.配置用戶信息app
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com編輯器2.查看配置信息
$ git config --list
3.獲取幫助
git help config
4.對現有的某個項目用git進行管理
git init
5.從現有的倉庫克隆
git clone [url]
6.查看當前文件狀態
git status
7.跟蹤新文件
git add . //跟蹤全部的新文件,並處於暫存狀態
git add 1.txt //跟蹤某個新文件,並處於暫存狀態
8.查看具體修改了什麼地方
git diff //此命令只能查看已修改但未暫存起來的變化內容
git diff --staged 或 git diff --cached //此命令只能查看暫存起來的文件的內容變化
9.提交更新
git commit
git commit -m 'xxxx' //加-m參數後此命令可跟提交說明方式
git commit -a -m 'xxxx' //加 -a參數後此命令會自動把已經跟蹤過的文件暫存起來一併提交,跳過使用暫存區域(注意:新添加的文件卻不能用此命令)
10.移除文件
git rm --cached b.vue //從暫存區中移除某個文件,但工做目錄中仍然存在
git rm -f b.vue //強制刪除某個文件,工做目錄中也刪除掉
11.查看提交歷史
git log //不帶任何的參數,按提交時間列出全部的更新,最近的排在最上面
git log -p //選項展開顯示每次提交的內容差別
git log -2 //僅展現最近的兩次更新
git log --pretty=oneline //將每一個提交放在一行顯示,這在提交數很大時很是有用
12.撤銷操做
(1)修改最後一次提交
有時候咱們提交完了才發現漏掉了幾個文件沒有加,或者提交信息寫錯了。想要撤消剛纔的提交操做,可使用
--amend
選項從新提交:git commit --amend
此命令將使用當前的暫存區域快照提交。若是剛纔提交完沒有做任何改動,直接運行此命令的話,至關於有機會從新編輯提交說明,但將要提交的文件快照和以前的同樣。
啓動文本編輯器後,會看到上次提交時的說明,編輯它確認沒問題後保存退出,就會使用新的提交說明覆蓋剛纔失誤的提交。
若是剛纔提交時忘了暫存某些修改,能夠先補上暫存操做,而後再運行
--amend
提交:git commit -m 'lg'
git add .
git commit --amend
上面的三條命令最終只是產生一個提交,第二個提交命令修正了第一個的提交內容。
(2)取消已經暫存的文件
接下來的兩個小節將演示如何取消暫存區域中的文件,以及如何取消工做目錄中已修改的文件。不用擔憂,查看文件狀態的時候就提示了該如何撤消,因此不須要死記硬背。來看下面的例子,有兩個修改過的文件,咱們想要分開提交,但不當心用
git add .
全加到了暫存區域。該如何撤消暫存其中的一個文件呢?其實,git status
的命令輸出已經告訴了咱們該怎麼作:$ 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
benchmarks.rb: locally modified
$ 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這條命令看起來有些古怪,先別管,能用就行。如今 benchmarks.rb 文件又回到了以前已修改未暫存的狀態。
13.遠程倉庫的使用
要參與任何一個 Git 項目的協做,必需要了解該如何管理遠程倉庫。遠程倉庫是指託管在網絡上的項目倉庫,可能會有好多個,其中有些你只能讀,另外有些能夠寫。同他人協做開發某個項目時,須要管理這些遠程倉庫,以便推送或拉取數據,分享各自的工做進展。管理遠程倉庫的工做,包括添加遠程庫,移除廢棄的遠程庫,管理各式遠程庫分支,定義是否跟蹤這些分支,等等。本節咱們將詳細討論遠程庫的管理和使用。
(1)查看當前的遠程庫
要查看當前配置有哪些遠程倉庫,能夠用
git remote
命令,它會列出每一個遠程庫的簡短名字。在克隆完某個項目後,至少能夠看到一個名爲 origin 的遠程庫,Git 默認使用這個名字來標識你所克隆的原始倉庫:$ git clone git://github.com/schacon/ticgit.git Initialized empty Git repository in /private/tmp/ticgit/.git/ remote: Counting objects: 595, done. remote: Compressing objects: 100% (269/269), done. remote: Total 595 (delta 255), reused 589 (delta 253) Receiving objects: 100% (595/595), 73.31 KiB | 1 KiB/s, done. Resolving deltas: 100% (255/255), done. $ cd ticgit $ git remote origin也能夠加上
-v
選項(譯註:此爲--verbose
的簡寫,取首字母),顯示對應的克隆地址:$ git remote -v origin git://github.com/schacon/ticgit.git若是有多個遠程倉庫,此命令將所有列出。好比在個人 Grit 項目中,能夠看到:
$ cd grit $ git remote -v bakkdoor git://github.com/bakkdoor/grit.git cho45 git://github.com/cho45/grit.git defunkt git://github.com/defunkt/grit.git koke git://github.com/koke/grit.git origin git@github.com:mojombo/grit.git這樣一來,我就能夠很是輕鬆地從這些用戶的倉庫中,拉取他們的提交到本地。請注意,上面列出的地址只有 origin 用的是 SSH URL 連接,因此也只有這個倉庫我能推送數據上去(咱們會在第四章解釋緣由)。
(2)添加遠程倉庫
要添加一個新的遠程倉庫,能夠指定一個簡單的名字,以便未來引用,運行
git remote add [shortname] [url]
:$ git remote origin $ git remote add pb git://github.com/paulboone/ticgit.git $ git remote -v origin git://github.com/schacon/ticgit.git pb git://github.com/paulboone/ticgit.git如今能夠用字符串
pb
指代對應的倉庫地址了。好比說,要抓取全部 Paul 有的,但本地倉庫沒有的信息,能夠運行git fetch pb
:$ git fetch pb remote: Counting objects: 58, done. remote: Compressing objects: 100% (41/41), done. remote: Total 44 (delta 24), reused 1 (delta 0) Unpacking objects: 100% (44/44), done. From git://github.com/paulboone/ticgit * [new branch] master -> pb/master * [new branch] ticgit -> pb/ticgit如今,Paul 的主幹分支(master)已經徹底能夠在本地訪問了,對應的名字是
pb/master
,你能夠將它合併到本身的某個分支,或者切換到這個分支,看看有些什麼有趣的更新。(3)從遠程倉庫抓取數據
正如以前所看到的,能夠用下面的命令從遠程倉庫抓取數據到本地:
$ git fetch [remote-name]此命令會到遠程倉庫中拉取全部你本地倉庫中尚未的數據。運行完成後,你就能夠在本地訪問該遠程倉庫中的全部分支,將其中某個分支合併到本地,或者只是取出某個分支,一探究竟。(咱們會在第三章詳細討論關於分支的概念和操做。)
若是是克隆了一個倉庫,此命令會自動將遠程倉庫歸於 origin 名下。因此,
git fetch origin
會抓取從你上次克隆以來別人上傳到此遠程倉庫中的全部更新(或是上次 fetch 以來別人提交的更新)。有一點很重要,須要記住,fetch 命令只是將遠端的數據拉到本地倉庫,並不自動合併到當前工做分支,只有當你確實準備好了,才能手工合併。若是設置了某個分支用於跟蹤某個遠端倉庫的分支(參見下節及第三章的內容),可使用
git pull
命令自動抓取數據下來,而後將遠端分支自動合併到本地倉庫中當前分支。在平常工做中咱們常常這麼用,既快且好。實際上,默認狀況下git clone
命令本質上就是自動建立了本地的 master 分支用於跟蹤遠程倉庫中的 master 分支(假設遠程倉庫確實有 master 分支)。因此通常咱們運行git pull
,目的都是要從原始克隆的遠端倉庫中抓取數據後,合併到工做目錄中的當前分支。(4)推送數據到遠程倉庫
項目進行到一個階段,要同別人分享目前的成果,能夠將本地倉庫中的數據推送到遠程倉庫。實現這個任務的命令很簡單:
git push [remote-name] [branch-name]
。若是要把本地的 master 分支推送到origin
服務器上(再次說明下,克隆操做會自動使用默認的 master 和 origin 名字),能夠運行下面的命令:$ git push origin master只有在所克隆的服務器上有寫權限,或者同一時刻沒有其餘人在推數據,這條命令纔會如期完成任務。若是在你推數據前,已經有其餘人推送了若干更新,那你的推送操做就會被駁回。你必須先把他們的更新抓取到本地,合併到本身的項目中,而後才能夠再次推送。有關推送數據到遠程倉庫的詳細內容見第三章。
(5)查看遠程倉庫信息
咱們能夠經過命令
git remote show [remote-name]
查看某個遠程倉庫的詳細信息,好比要看所克隆的origin
倉庫,能夠運行:$ git remote show origin * remote origin URL: git://github.com/schacon/ticgit.git Remote branch merged with 'git pull' while on branch master master Tracked remote branches master ticgit除了對應的克隆地址外,它還給出了許多額外的信息。它友善地告訴你若是是在 master 分支,就能夠用
git pull
命令抓取數據合併到本地。另外還列出了全部處於跟蹤狀態中的遠端分支。上面的例子很是簡單,而隨着使用 Git 的深刻,
git remote show
給出的信息可能會像這樣:$ git remote show origin * remote origin URL: git@github.com:defunkt/github.git Remote branch merged with 'git pull' while on branch issues issues Remote branch merged with 'git pull' while on branch master master New remote branches (next fetch will store in remotes/origin) caching Stale tracking branches (use 'git remote prune') libwalker walker2 Tracked remote branches acl apiv2 dashboard2 issues master postgres Local branch pushed with 'git push' master:master它告訴咱們,運行
git push
時缺省推送的分支是什麼(譯註:最後兩行)。它還顯示了有哪些遠端分支尚未同步到本地(譯註:第六行的caching
分支),哪些已同步到本地的遠端分支在遠端服務器上已被刪除(譯註:Stale tracking branches
下面的兩個分支),以及運行git pull
時將自動合併哪些分支(譯註:前四行中列出的issues
和master
分支)。(6)遠程倉庫的刪除和重命名
在新版 Git 中能夠用
git remote rename
命令修改某個遠程倉庫在本地的簡稱,好比想把pb
改爲paul
,能夠這麼運行:$ git remote rename pb paul $ git remote origin paul注意,對遠程倉庫的重命名,也會使對應的分支名稱發生變化,原來的
pb/master
分支如今成了paul/master
。碰到遠端倉庫服務器遷移,或者原來的克隆鏡像再也不使用,又或者某個參與者再也不貢獻代碼,那麼須要移除對應的遠端倉庫,能夠運行
git remote rm
命令:$ git remote rm paul $ git remote origin
(7)有關分支
git branch #列出全部本地分支
git branch -r #列出全部遠程分支
git branch -a #列出全部分支(包括本地和遠程)
git branch [分支名] #添加一個本地分支,但不切換
git checkout [分支名] #切換到該分支上
git checkout -b [分支名] #新建一個分支,並切換到這個分支上,至關於執行 git branch [分支名] 和 git checkout [分支名] 這兩步
git push origin [本地分支]:[遠程分支] #新建一個遠程分支,並把本地分支上的代碼推送到新建的遠程分支上
git branch -d [分支名] #刪除本地分支
git push origin -d [分支名] #刪除遠程分支
git merge [某分支名] #把某分支上的代碼合併到當前分支上
(8)版本回退
在git中,用'HEAD'表示當前版本,也就是最新提交的版本;
上一個版本就是'HEAD^',上上一個版本就是'HEAD^^'
git reset --hard HEAD^ #從當前版本回退到上一個版本
git reset --hard HEAD^^ #從當前版本回退到上上一個版本
git reset --hard [版本號的前幾位] #從當前版本回退到指定版本,例如:git reset --hard 1094a (不必寫全前幾位就能夠);
在Git中,老是有後悔藥能夠吃的。當你用
$ git reset --hard HEAD^
回退到add distributed(上一次版本)
版本時,再想恢復到append GPL(最近的一次版本)
,就必須找到append GPL
的commit id。Git提供了一個命令git reflog
用來記錄你的每一次命令:liujianguodeMacBook-Pro:gitweb liujianguo$ git reflog b1ac482 (HEAD -> master) HEAD@{0}: reset: moving to b1ac4825 f1c173c HEAD@{1}: reset: moving to HEAD^ b1ac482 (HEAD -> master) HEAD@{2}: reset: moving to HEAD b1ac482 (HEAD -> master) HEAD@{3}: commit: lg f1c173c HEAD@{4}: commit: lg df801e9 HEAD@{5}: commit (initial): lg(8)撤銷修改
命令
git checkout -- readme.txt
意思就是,把readme.txt
文件在工做區的修改所有撤銷,這裏有兩種狀況:一種是
readme.txt
自修改後尚未被放到暫存區,如今,撤銷修改就回到和版本庫如出一轍的狀態;一種是
readme.txt
已經添加到暫存區後,又做了修改,如今,撤銷修改就回到添加到暫存區後的狀態。總之,就是讓這個文件回到最近一次
git commit
或git add
時的狀態。
git checkout -- file
命令中的--
很重要,沒有--
,就變成了「切換到另外一個分支」的命令