經過命令 git init 把這個目錄變成git能夠管理的倉庫html
git的工做流程通常是這樣的:git
1、在工做目錄中添加、修改文件;segmentfault
2、將須要進行版本管理的文件放入暫存區域;安全
3、將暫存區域的文件提交到版本庫。fetch
首先新建一個文件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命令查看這一提交詳細信息。
spa
若是想查看所有提交信息,則使用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。
1.reset
git checkout hotfix git reset HEAD~2 git push -f
git reset --hard HEAD^ //回退上一個版本 在Git中,用HEAD表示當前版本。 git reset --hard HEAD~100 //往上100個版本
git reset用於撤銷未被提交到remote的改動,即撤銷local的修改。除了移動當前分支的HEAD,還能夠更改workspace和index:
--soft:修改HEAD,不修改index和workspace。
--mixed:修改HEAD和index,不修改workspace。默認行爲。
--hard:修改HEAD、index、workspace。
git reset --mixed HEAD把index的內容退回到workspace中。
git reset --hard HEAD把index和workspace的修改所有撤銷。
2.revert
$ git checkout hotfix $ git revert HEAD^^
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添加新的提交時候你應該建立一個新的分支。
參考連接
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。
git clone <版本庫的網址> <本地目錄名>
若是本地庫須要和遠程庫進行關聯,則:
git remote add [shortname] [url]
git pull = git fetch + git merge git pull --rebase = git fetch + git rebase //推薦
想要更好的提交樹,使用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參數, 使之不產生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 list //查看已存在更改的列表 git stash pop //可從堆棧中刪除更改並將其放置在當前工做目錄中
git push origin master // git遠程版本回退 git push origin HEAD --force
查看分支: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歷史壓縮爲一次
在cherry-pick,您能夠從其餘分支複製指定的提交,而後導入到如今的分支。
git cherry-pick <commit id>
master主分支應該很是穩定,用來發布新版本,通常狀況下不容許在上面工做,工做通常狀況下在新建的dev分支上工做,工做完後,好比上要發佈,或者說dev分支代碼穩定後能夠合併到主分支master上來。
阮一峯:Git分支管理策略