Git總結

參考資料

git config

  • git config --global user.name "Your Name"
  • git config --global user.email "[email protected]"
  • git config --list

    注意git config命令的–global參數,用了這個參數,表示你這臺機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的用戶名和Email地址。


基本操作
* git init
* git diff
* git add <file>
* git commit
* git status

git diff

  • git diff #是工作區(work dict)和暫存區(stage)的比較
  • git diff –cached #是暫存區(stage)和分支(master)的比較
  • git diff HEAD #查看工作區和版本庫裏面最新版本的區別

    git diff HEAD – readme.txt

  • git diff master test # 比較分支
  • git diff test
    如果你要查看當前的工作目錄與另外一個分支的差別
    –stat 參數可以統計一下有哪些文件被改動,有多少行被改動:

commit
需要使用-m添加本次修改的註釋,完成後就會記錄一個新的項目版本。除了用git add 命令,我們還可以用下面的命令將所有沒有加到緩存區的修改也一起提交,但-a命令不會添加新建的文件。

git log

  • git log
  • git log –pretty=oneline
  • git reflog

    用來記錄你的每一次命令

  • 用git log –graph命令可以看到分支合併圖。
  • git log –graph –pretty=format:’%h -%d %s (%cr)’ –abbrev-commit –reflog
  • 使用git revert <commit_id>操作實現以退爲進,

    git revert 不同於 git reset 它不會擦除”回退”之後的 commit_id ,而是正常的當做一次”commit”,產生一次新的操作記錄,所以可以push,不會讓你再pull

    假設一開始你的本地和遠程都是:
    a -> b -> c
    你想把HEAD回退到b,那麼在本地就變成了:
    a -> b
    這個時候,如果沒有遠程庫,你就接着怎麼操作都行,比如:
    a -> b -> d
    但是在有遠程庫的情況下,你push會失敗,因爲遠程庫是 a->b->c,你的是 a->b->d
    兩種方案:
    push的時候用--force,強制把遠程庫變成a -> b -> d,大部分公司嚴禁這麼幹,會被別人揍一頓
    做一個反向操作,把自己本地變成a -> b -> c -> d,注意b和d文件快照內容一莫一樣,但是commit id肯定不同,再push上去遠程也會變成 a -> b -> c -> d
    簡單地說就是你無法容易地抹去遠程庫的提交信息,所以本地提交怎麼都行,push前想好了
    

git reset

  • git reset –hard HEAD~
  • git reset –hard HEAD~100
  • git reset –hard 3628164
    commit id(版本號)沒必要寫全

撤銷修改

  • 場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout – file。
  • 場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。
  • 場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。

git checkout

  • git checkout HEAD~ files

    checkout命令用於從歷史提交(或者暫存區域)中拷貝文件到工作目錄,也可用於切換分支。當給定某個文件名時,git會從指定的提交中拷貝文件到暫存區域和工作目錄。比如,git checkout HEAD~ foo.c會將提交節點HEAD~(即當前提交節點的父節點)中的foo.c複製到工作目錄並且加到暫存區域中。(如果命令中沒有指定提交節點,則會從暫存區域中拷貝內容。)注意當前分支不會發生變化。

  • git checkout maint
    當不指定文件名,而是給出一個(本地)分支時,那麼HEAD標識會移動到那個分支(也就是說,我們“切換”到那個分支了),然後暫存區域和工作目錄中的內容會和HEAD對應的提交節點一致。新提交節點(下圖中的a47c3)中的所有文件都會被複制(到暫存區域和工作目錄中);只存在於老的提交節點(ed489)中的文件會被刪除;不屬於上述兩者的文件會被忽略,不受影響。
  • git checkout master~3
    如果既沒有指定文件, 也沒有指定分枝. 而是隻給出一段提交的歷史Hash, 只有HEAD會移動到相應的歷史提交. 這會造成HEAD分離, 非常危險的操作, 這個命令的說明只是爲了滿足你的好奇心而已, 不要使用這個命令.
  • git reset master~3
    reset命令把當前分支指向另一個位置,並且有選擇的變動工作目錄和索引。也用來在從歷史倉庫中複製文件到索引,而不動工作目錄。
    如果不給選項,那麼當前分支指向到那個提交。如果用–hard選項,那麼工作目錄也更新,如果用–soft選項,那麼都不變。
  • gir reset
    如果沒有給出提交點的版本號,那麼默認用HEAD。這樣,分支指向不變,但是索引會回滾到最後一次提交,如果用–hard選項,工作目錄也同樣。

–隔離了樹與路徑
– 的名稱叫做double dash,是bash的內置命令,用來標記可選命令選項的結束。即在它後面的帶 – 的字符串,不被當做是一個命令選項。

git branch

  • git branch dev
  • git checkout命令加上-b參數表示創建並切換,相當於以下兩條命令:
    git branch dev
    git checkout dev
  • git merge命令用於合併指定分支到當前分支。合併後,再查看readme.txt的內容,就可以看到,和dev分支的最新提交是完全一樣的。
    注意到上面的Fast-forward信息,Git告訴我們,這次合併是“快進模式”,也就是直接把master指向dev的當前提交,所以合併速度非常快。
    當然,也不是每次合併都能Fast-forward,我們後面會講其他方式的合併。
  • 刪除分支:git branch -d <name> -D 強制刪除
  • git merge –no-ff -m “merge with no-ff” dev
    合併分支時,加上–no-ff參數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而fast forward合併就看不出來曾經做過合併。

Bug分支

  1. git stash

    用git status查看工作區,就是乾淨的(除非有沒有被Git管理的文件),因此可以放心地創建分支來修復bug。

  2. git checkout master
  3. git checkout -b issue-101
  4. git add readme.txt
  5. git commit -m “fix bug 101”
  6. git checkout master
  7. git merge –no-ff -m “merged bug fix 101” issue-101
  8. git branch -d issue-101
  9. git checkout dev # 回到dev幹活
  10. git stash list
    $ git stash list
    stash@{0}: WIP on dev: 6224937 add merge

一是用git stash apply恢復,但是恢復後,stash內容並不刪除,你需要用git stash drop來刪除;

另一種方式是用git stash pop,恢復的同時把stash內容也刪了:

你可以多次stash,恢復的時候,先用git stash list查看,然後恢復指定的stash,用命令:

$ git stash apply stash@{0}

當手頭工作沒有完成時,先把工作現場git stash一下,然後去修復bug,修復後,再git stash pop,回到工作現場。

不使用stash的話index會公用 造成影響

多人協作

  • git remote add origin 地址
  • git remote
  • git remote -v
  • git push origin master
  • git push origin dev(dev 分支)
    因此,多人協作的工作模式通常是這樣:
    1. 首先,可以試圖用git push origin branch-name推送自己的修改;
    2. 如果推送失敗,則因爲遠程分支比你的本地更新,需要先用git pull試圖合併;
    3. 如果合併有衝突,則解決衝突,並在本地提交;
    4. 沒有衝突或者解決掉衝突後,再用git push origin branch-name推送就能成功!
    5. 如果git pull提示“no tracking information”,則說明本地分支和遠程分支的鏈接關係沒有創建,用命令git branch –set-upstream branch-name origin/branch-name。
      這就是多人協作的工作模式,一旦熟悉了,就非常簡單。

小結

  • 查看遠程庫信息,使用git remote -v;
  • 本地新建的分支如果不推送到遠程,對其他人就是不可見的;
  • 從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠程的新提交;
  • 在本地創建和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致;
  • 建立本地分支和遠程分支的關聯,使用git branch –set-upstream branch-name origin/branch-name;
  • 從遠程抓取分支,使用git pull,如果有衝突,要先處理衝突。

git tag


  • git tag <name>
  • 可以用命令git tag查看所有標籤
  • git tag v0.9 6224937 # 找到歷史提交的commit id

注意,標籤不是按時間順序列出,而是按字母排序的。可以用git show <tagname>查看標籤信息:

  • git tag -a v0.1 -m “version 0.1 released” 3628164
    還可以創建帶有說明的標籤,用-a指定標籤名,-m指定說明文字
  • git tag -d v0.1
    如果標籤打錯了,也可以刪除
  • 命令git push origin 可以推送一個本地標籤;
  • 命令git push origin –tags可以推送全部未推送過的本地標籤;
  • 命令git tag -d 可以刪除一個本地標籤;
  • 命令git push origin :refs/tags/可以刪除一個遠程標籤。
    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章