git 入門

1、得到GIT倉庫

      有兩種得到GIT倉庫的方法,一是在須要用GIT管理的項目的根目錄執行:html

git initgit

      執行後能夠看到,僅僅在項目目錄多出了一個.git目錄,關於版本等的全部信息都在這個目錄裏面。算法

      另外一種方式是克隆遠程目錄,因爲是將遠程服務器上的倉庫徹底鏡像一份至本地,而不是取某一個特定版本,因此用clone而不是checkout:服務器

git cloneapp

 

2、GIT中版本的保存

        記錄版本信息的方式主要有兩種:yii

  1. 記錄文件每一個版本的快照
  2. 記錄文件每一個版本之間的差別

        GIT採用第一種方式。GIT不關心文件兩個版本之間的具體差異,而是關心文件的總體是否有改變,若文件被改變,在添加提交時就生成文件新版本的快照,而判斷文件總體是否改變的方法就是用SHA-1算法計算文件的校驗和。ui

 

3、文件狀態

        GIT倉庫所在的目錄稱爲工做目錄,這個很好理解,咱們的工程就在這裏,工做時也是在這裏作修改。spa

        在工做目錄中的文件被分爲兩種狀態,一種是已跟蹤狀態(tracked),另外一種是未跟蹤狀態(untracked)。只有處於已跟蹤狀態的文件才被歸入GIT的版本控制。版本控制

        當咱們往工做目錄添加一個文件的時候,這個文件默認是未跟蹤狀態的。用如下命令能夠跟蹤文件:code

git add 

       

  GIT的三個工做區域:本地數據(倉庫)目錄,工做目錄,暫存區,以下圖所示:

        Git與Repo入門

        git directory就是咱們的本地倉庫.git目錄,裏面保存了全部的版本信息等內容。

    working driectory,工做目錄,就是咱們的工做目錄,其中包括未跟蹤文件及已跟蹤文件,而已跟蹤文件都是從git directory取出來的文件的某一個版本或新跟蹤的文件。

        staging area,暫存區,不對應一個具體目錄,其時只是git directory中的一個特殊文件。

        當咱們修改了一些文件後,要將其放入暫存區而後才能提交,每次提交時其實都是提交暫存區的文件到git倉庫,而後清除暫存區。而checkout某一版本時,這一版本的文件就從git倉庫取出來放到了咱們的工做目錄。

    使用以下命令可查詢當前文件狀態

git status

  暫存文件

git add file A  //暫存文件A

git add .   //暫存當前目錄下全部文件

   取消暫存文件

git reset HEAD File

    如修改了文件,想恢復

git checkout -- File

4、查看文件修改後的差別

git diff

"git diff"顯示的是文件修改後尚未暫存起來的內容,那若是要比較暫存區的文件與以前已經提交過的文件呢,能夠用如下命令:

git diff --cached

5、忽略一些文件

若是有一些部件咱們不想歸入版本控制,也不想在每次"git status"時看到這些文件的提示,或者不少時候咱們爲了方便會使用"git add ."添加全部修改的文件,這時就會添加上一些咱們不想添加的文件,怎麼忽略這些文件呢?

        GIT固然提供了方法,只需在主目錄下創建".gitignore"文件,此文件有以下規則:

  • 全部以#開頭的行會被忽略
  • 可使用glob模式匹配
  • 匹配模式後跟反斜槓(/)表示要忽略的是目錄
  • 若是不要忽略某模式的文件在模式前加"!"

        好比:

# 此爲註釋 – 將被 Git 忽略
*.a # 忽略全部 .a 結尾的文件
!lib.a # 但 lib.a 除外
/TODO # 僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO
build/ # 忽略 build/ 目錄下的全部文件
doc/*.txt # 會忽略 doc/notes.txt 但不包括 doc/server/arch.txt

6、移除文件

若是提交暫存區後,本地刪除了一些文件,這些文件的移除是沒法提交到暫存區的。這時候就能夠用到命令:

git rm 

若是咱們以前不是經過"git rm"刪除了不少文件呢?好比說經過patch或者經過GUI,若是這些文件命名沒有規則,一個一個地執行"git rm"會搞死人的,這時能夠用如下命令:

git rm $(git ls-files --deleted)

7、移動文件(同移除文件)

git mv old_name new_name

 這個命令等效於

mv old_name new_name

git rm old_name

git add new_name

8、儲藏-Stashing

遇到狀況:①在工做分支上工做進行到一半,忽然有其餘緊急的任務,須要切換分支;②在工做分支上工做進行到一半,須要從遠程庫中pull新的代碼,而代碼極可能和當前工做目錄中代碼存在衝突

能夠執行

git stash 

 這時你會發現你的工做目錄變得很乾淨了,就能夠隨意切分支進行其餘事情的處理了。

 能夠經過以下命令查看全部stash列表

git stash list 

當緊急事情處理完了,須要從新回來這裏進行原來的工做時,只需把Stash區域的內容取出來應用到當前工做目錄就行,命令就是

git stash apply

git stash apply以後再git stash list會發現,apply後的stash還在stash列表中,若是要將其從stash列表中刪除能夠用

git stash drop

丟棄這個stash,stash的命令參數均可選擇指定stash名字,不然就是最新的stash。

通常狀況下apply stash後應該就能夠把它從stash列表刪除了,先apply再drop仍是比較繁瑣的,使用如下一條命令就能夠同時完成這兩個操做

git stash pop

9、提交

git commit

若是咱們想跳過暫存區直接提交修改的文件,可使用"-a"參數,但要慎重,別一不當心提交了不想提交的文件

git commit -a

若是須要快捷地填寫提交說明可以使用"-m"參數

git commit -m 'commit message'

修訂提交

        若是咱們提交事後發現有個文件改錯了,或者只是想修改提交說明,這時能夠對相應文件作出修改,將修改過的文件經過"git add"添加到暫存區,而後執行如下命令:

git commit --amend

        而後修改提交說明覆蓋上次提交,但只能重寫最後一次提交。

 

重排提交

        經過衍合(rebase)能夠修改多個提交的說明,並能夠重排提交歷史,拆分、合併提交,關於rebase在講到分支時再說,這裏先看一下重排提交。

        假設咱們的提交歷史是這樣的:

        Git與Repo入門

        若是咱們想重排最後兩個提交的提交歷史,能夠藉助交互式rebase命令: 

 git rebase -i HEAD~2 或 git rebase -i 3366e1123010e7d67620ff86040a061ae76de0c8

        HEAD~2表示倒數第三個提交,這條命令要指定要重排的最舊的提交的父提交,此處要重排Second commit與Third commit,因此要指定Initial commit的Commit ID。如圖所示:

        Git與Repo入門

        註釋部分詳細說明了每一個選項的做用,若是咱們想交互這兩個提交,只需把開頭的這兩行交換下位置就OK了,交換位置後保存,而後看下提交歷史:

        Git與Repo入門

        能夠看到提交歷史已經變了,並且最新的兩個提交的Commit ID變了,若是這些提交已經push到了遠程服務器,就不要用這個命令了。

 10、PUSH到遠程庫

git push命令用於將本地分支的更新,推送到遠程主機。它的格式與git pull命令相仿。

$ git push <遠程主機名> <本地分支名>:<遠程分支名>

注意,分支推送順序的寫法是<來源地>:<目的地>,因此git pull是<遠程分支>:<本地分支>,而git push是<本地分支>:<遠程分支>。

若是省略遠程分支名,則表示將本地分支推送與之存在」追蹤關係」的遠程分支(一般二者同名),若是該遠程分支不存在,則會被新建。

$ git push origin master

上面命令表示,將本地的master分支推送到origin主機的master分支。若是後者不存在,則會被新建。

若是省略本地分支名,則表示刪除指定的遠程分支,由於這等同於推送一個空的本地分支到遠程分支。

$ git push origin :master
# 等同於
$ git push origin --delete master

上面命令表示刪除origin主機的master分支。

若是當前分支與遠程分支之間存在追蹤關係,則本地分支和遠程分支均可以省略。

$ git push origin

上面命令表示,將當前分支推送到origin主機的對應分支。

若是當前分支只有一個追蹤分支,那麼主機名均可以省略。

$ git push

若是當前分支與多個主機存在追蹤關係,則可使用-u選項指定一個默認主機,這樣後面就能夠不加任何參數使用git push。

$ git push -u origin master

上面命令將本地的master分支推送到origin主機,同時指定origin爲默認主機,後面就能夠不加任何參數使用git push了。

不帶任何參數的git push,默認只推送當前分支,這叫作simple方式。此外,還有一種matching方式,會推送全部有對應的遠程分支的本地分支。Git 2.0版本以前,默認採用matching方法,如今改成默認採用simple方式。若是要修改這個設置,能夠採用git config命令。

$ git config --global push.default matching
# 或者
$ git config --global push.default simple

還有一種狀況,就是不論是否存在對應的遠程分支,將本地的全部分支都推送到遠程主機,這時須要使用–all選項。

$ git push --all origin

上面命令表示,將全部本地分支都推送到origin主機。

若是遠程主機的版本比本地版本更新,推送時Git會報錯,要求先在本地作git pull合併差別,而後再推送到遠程主機。這時,若是你必定要推送,可使用–force選項。

$ git push --force origin

上面命令使用–force選項,結果致使在遠程主機產生一個」非直進式」的合併(non-fast-forward merge)。除非你很肯定要這樣作,不然應該儘可能避免使用–force選項。

最後,git push不會推送標籤(tag),除非使用–tags選項。

$ git push origin --tags


來源:

http://www.open-open.com/lib/view/open1405048177091.html

http://www.yiibai.com/git/git_push.html#

相關文章
相關標籤/搜索