git完整總結

clipboard.png

本地庫

經過命令 git init 把這個目錄變成git能夠管理的倉庫html

git 本地工做流程

clipboard.png

git的工做流程通常是這樣的:git

1、在工做目錄中添加、修改文件;segmentfault

2、將須要進行版本管理的文件放入暫存區域;安全

3、將暫存區域的文件提交到版本庫。fetch

文件4種狀態

clipboard.png

本地庫提交

首先新建一個文件readme.txt,把文件提交到倉庫:url

git add readme.txt

git commit -m "description"
若是有大量文件進行改變,所有進行add,則使用 git add .。
若是想add並commit,則使用 git commit -a -m "Changed some files"。
git commit 命令的-a選項可將全部被修改或者已刪除的且已經被git管理的文檔提交到倉庫中。
千萬注意,-a不會形成新文件被提交,只能修改。

咱們如今可使用git show命令查看這一提交詳細信息。
clipboard.pngspa

若是想查看所有提交信息,則使用git log。3d

git log 
git log --pretty=oneline

時光機穿梭

如今改變readme.txt文件,添加一些內容,使用git status命令看看結果。指針

git status命令可讓咱們時刻掌握倉庫當前的狀態。code

雖然 Git 告訴咱們 readme.txt 被修改了,但若是能看看具體修改了什麼內容,天然是很好的。好比你休假兩週從國外回來,第一天上班時,已經記不清上次怎麼修改的 readme.txt,因此,須要用git diff readme.txt這個命令看看。

git diff <file> # 比較當前文件和暫存區文件差別

git diff <id1><id1><id2> # 比較兩次提交之間的差別

git diff <branch1> <branch2> # 在兩個分支之間比較

git diff --staged # 比較暫存區和版本庫差別

git diff --cached # 比較暫存區和版本庫差別

git diff --stat # 僅僅比較統計信息

撤銷操做

git的撤銷操做:reset、checkout和revert
這三個命令均可以用於撤銷。

reset和checkout能夠做用於commit或者文件,revert只能做用於commit。

commit級別的操做

1.reset

git checkout hotfix
git reset HEAD~2
git push -f
git reset --hard HEAD^   //回退上一個版本
在Git中,用HEAD表示當前版本。
git reset --hard HEAD~100     //往上100個版本

clipboard.png
clipboard.png

git reset用於撤銷未被提交到remote的改動,即撤銷local的修改。除了移動當前分支的HEAD,還能夠更改workspace和index:

--soft:修改HEAD,不修改index和workspace。

--mixed:修改HEAD和index,不修改workspace。默認行爲。

--hard:修改HEAD、index、workspace。

clipboard.png

git reset --mixed HEAD把index的內容退回到workspace中。
git reset --hard HEAD把index和workspace的修改所有撤銷。

2.revert

$ git checkout hotfix
$ git revert HEAD^^

clipboard.png
clipboard.png

git revert <普通commitId>
git revert <merge commitId> -m <parent> // 必須選擇合併自哪一個分支,通常爲 1,2,可經過git show <merge commitId> 展現

revert經過新建一個commit來撤銷一次commit所作的修改,是一種安全的方式,並無修改commit history。

revert用於撤銷committed changes,reset用於撤銷uncommitted changes。
3.checkout
checkout做用於commit級別時,只是移動HEAD到不一樣的commit。若是有unstaged的文件,git會阻止操做並提示。這對於快速查看文件舊版原本說很是方便,但若是你當前的HEAD沒有任何分支引用,那麼這會形成HEAD分離。所以,在爲分離的HEAD添加新的提交時候你應該建立一個新的分支。
參考連接

file級別的操做

1.git reset
1)暫存區回退

git reset [file]
git reset HEAD readme.txt

2.git checkout
1)工做區回退
若是比對後,發現此次改動不是咱們想要的,那麼咱們能夠回退到未修改以前:

git checkout readme.txt
git checkout .
git checkout -- readme.txt  // 以防判斷成分支

2)用指定commit提交的內容覆蓋工做區,並非真正的回退

git checkout HEAD filename
git checkout  commit_Id  -- readme.txt

遠程庫

當你從遠程庫克隆時候,實際上Git自動把本地的master分支和遠程的master分支對應起來了,而且遠程庫的默認名稱是origin。

  1. 要查看遠程庫的信息 使用 git remote
  2. 要查看遠程庫的詳細信息 使用 git remote –v
git clone <版本庫的網址> <本地目錄名>

若是本地庫須要和遠程庫進行關聯,則:

git remote add [shortname] [url]

遠程拉取

git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase  //推薦

git rebase和git merge區別

clipboard.png

clipboard.png

想要更好的提交樹,使用rebase操做會更好一點,這樣能夠線性的看到每一次提交,而且沒有增長提交節點。

在rebase的過程當中,也許會出現衝突(conflict)。 在這種狀況,Git會中止rebase並會讓你去解決衝突;在解決完衝突後,用"git add"命令去更新這些內容, 而後,你無需執行 git-commit,只要執行:

git rebase --continue      // 繼續
git rebase --abort         // 取消
git rebase –skip           // 忽略衝突

而merge 操做遇到衝突的時候,當前merge不能繼續進行下去。手動修改衝突內容後,add 修改,commit 就能夠了。

給git pull默認加上rebase功能

git pull時能夠加上--rebase參數, 使之不產生Merge點, 保證了代碼的整潔, 即: git pull --rebase
但每次都加--rebase彷佛有些麻煩,咱們能夠指定某個分支在執行git pull時默認採用rebase方式:

git config branch.dev.rebase true

若是你以爲全部的分支都應該用rebase,那就設置:

git config --global branch.autosetuprebase always

這樣對於新建的分支都會設定上面的rebase=true了,已經建立好的分支仍是須要手動配置的。

git stash

若是當前開發內容並不想提交,可是又有另外緊急開發任務,可使用此命令。

git stash          //把當前工做的改變隱藏起來
git stash list     //查看已存在更改的列表
git stash pop      //可從堆棧中刪除更改並將其放置在當前工做目錄中

遠程提交及撤銷

git push origin master

// git遠程版本回退
git push origin HEAD --force

git分支

 查看分支:git branch
 建立分支:git branch name
 切換分支:git checkout name
 建立+切換分支:git checkout –b name
 合併某分支到當前分支:git merge name
 刪除分支:git branch –d name
  刪除遠程分支:git push origin --delete [branch-name] //git push origin :br

合併分支

git checkout master                    //切換到master
git merge <branch name>                //合併分支

--no-ff指的是強行關閉fast-forward方式。

fast-forward方式就是當條件容許的時候,git直接把HEAD指針指向合併分支的頭,完成合並。屬於「快進方式」,不過這種狀況若是刪除分支,則會丟失分支信息。由於在這個過程當中沒有建立commit

git merge --squash 是用來把一些沒必要要commit進行壓縮,好比說,你的feature在開發的時候寫的commit很亂,那麼咱們合併的時候不但願把這些歷史commit帶過來,因而使用--squash進行合併,此時文件已經同合併後同樣了,但不移動HEAD,不提交。須要進行一次額外的commit來「總結」一下,而後完成最終的合併。

總結:
--no-ff:不使用fast-forward方式合併,保留分支的commit歷史
--squash:使用squash方式合併,把屢次分支commit歷史壓縮爲一次

clipboard.png

提取其餘分支提交

在cherry-pick,您能夠從其餘分支複製指定的提交,而後導入到如今的分支。

git cherry-pick <commit id>

分支策略

master主分支應該很是穩定,用來發布新版本,通常狀況下不容許在上面工做,工做通常狀況下在新建的dev分支上工做,工做完後,好比上要發佈,或者說dev分支代碼穩定後能夠合併到主分支master上來。
阮一峯:Git分支管理策略


參考連接:
一個小時學會Git
Git 教程

相關文章
相關標籤/搜索