前言
看完了廖雪峯老師的git講解,寫篇文章總結一下,希望以後用得着的時候進來看看
最簡單的
首先git分爲工作區——暫存區——
git add:所有修改放到暫存區(Stage)
git commit -m "提交信息":一次性把暫存區的所有修改提交到分
支
git status :查看工作區狀態
git diff:可以查看工作區和暫存區修改內容
git log :顯示提交日誌(顯示commitId,Author,Date 提交信息)
git log --pretty=oneline:顯示一條線日誌(只顯示commitId和提交信息)
版本回退
git reset --hard head^ :還原到上個版本^個數對應上幾個版
本
git reset --hard <commitId>: 還原到特定版本
git reflog :查看命令版本歷史,回到未來哪個版本
git diff HEAD -- <file> :查看工作區和版本庫裏面最新版本的區別
撤銷修改
git checkout -- <file> 在工作區的修改全部撤銷
git reset HEAD <file>暫存區的修改撤銷掉(unstage),重新放回工作區
再嚴重點已經提交到版本庫的話並且沒有推送到遠程,那就用前面的版本命令會退到制定版本就ok。
刪除文件
1.如果你用的rm刪除文件,那就相當於只刪除了工作區的文件,如果想要恢復,直接用git checkout -- <file>就可以 2.如果你用的是git rm刪除文件,那就相當於不僅刪除了文件,而且還添加到了暫存區,需要先git reset HEAD <file>,然後再git checkout -- <file> 3.如果你想徹底把版本庫的刪除掉,先git rm,再git commit 就ok了
分支操作
注意點:
一般我們寫一個新功能時,會創建一個新的分支(假設dev)。然後在dev分支下開發,開發完成後 執行add,commit後切換到當前分支,此時在當前分支下是看不到dev上新功能的代碼的,所以需要merge dev分支到當前分支,最後刪除dev分支。
問題:這裏我發現 假如在dev分支上開發完成後不執行add,commit操作直接切換到原來分支,是可以看到dev上的功能代碼的,那麼那這樣的話,幹嘛其他分支還要add和提交呢??也不需要切換到主分支之後在進行合併操作了呀???直接在主分支push操作就可以了呀?
回答:你在dev分支修改了文件,但是你沒有提交到倉庫,實際上就是相當於你在本地手動修改了這個文件,倉庫並不能保存你做的改動,所以在master分支能看到文件被改動了(相當於你沒用dev分支直接修改了這個文件一樣),所以你可以用master分支add、commit
git checkout -b <dev> :創建並切換分支,相當於以下兩條命令
git branch <dev>:穿件分支dev
git checkout <dev>:切換到分支dev
git branch :列出所有分支,當前分支前面會標一個*號
git branch -d <dev>:刪除當前分支
git merge <dev>:合併某分支到當前分支git log --graph命令可以看到分支合併圖
合併dev
分支,默認是Fast forward模式(
看不出來曾經做過合併),
請注意--no-ff
參數,表示禁用Fast forward ,
因爲本次合併要創建一個新的commit,所以加上-m
參數,把commit描述寫進去。
git merge --no-ff -m "merge with no-ff" dev
衝突解決
當Git無法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。
解決衝突就是把Git合併失敗的文件手動編輯爲我們希望的內容,再提交。
處理緊急bug
git stash : 當前工作現場“儲藏”起來
git stash list :列出儲藏列表
git stash apply: 恢復後,stash內容並不刪除
git stash drop:刪除儲藏
git stash pop:恢復的同時把stash內容也刪了
git cherry-pick <commit>:把bug提交的修改“複製”到當前分支,避免重複勞動。
git branch -D <name>:丟棄一個沒有被合併過得分支
先說幾個名詞 未被追蹤的文件:指的是新建的文件或文件夾且還沒加入到暫存區(新建的還沒有被git add 過得) 未加入到暫存區的文件:指的是已經被追蹤過,但是沒有加入到暫存區(已經執行過git add/commit的但是這次修改後還沒有git add) 舉例: readme.md 已經被git add/git commit過,但是呢 我這次只是修改了,而且沒有修改完,不能commit test 新建的文件夾,沒有被git add/git commit過 有個急事需要處理,這時候我需要切換分支,去處理緊急任務,比如文中的舉例去修改bug, 正確的步驟: git add test(讓git去追蹤這個新文件) git stash保留現場 如果我不執行這兩個命令,那麼我在修改BUG完成之後 git status,就會發現readme.md 沒有添加到暫存區,同時又多了個test文件,但是自己的readme.md沒有完成,萬萬不可以提交,這樣導致bug的修改代碼也提交不了。所以你需要 git stash,這樣你在提交修改bug代碼的時候 ,就不會看見readme.md 和 test。可以安心提交修改bug的代碼。git stash
不能將未被追蹤的文件(untracked file)壓棧,也就是從未被git add
過的文件,也就是你在使用git status
命令看到的提示Untracked files
所列出的文件,所以在git stash
之前一定要用git status
確認沒有Untracked files
遠程庫推送
git remote -v:
查看遠程庫信息
本地新建的分支如果不推送到遠程,對其他人就是不可見的;
從本地推送分支,使用git push origin branch-name
,如果推送失敗,先用git pull
抓取遠程的新提交;
你本地已經建立了dev分支,但是還沒有和遠程dev分支關聯的時候採用使用git checkout -b branch-name origin/branch-name
或者
建立本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name
;
從遠程抓取分支,使用git pull
,如果有衝突,要先處理衝突
tag打標籤
-
命令
git tag <tagname>
用於新建一個標籤,默認爲HEAD
,也可以指定一個commit id; -
命令
git tag -a <tagname> -m "blablabla..."
可以指定標籤信息; -
命令
git tag
可以查看所有標籤。 -
命令
git push origin <tagname>
可以推送一個本地標籤; -
命令
git push origin --tags
可以推送全部未推送過的本地標籤; -
命令
git tag -d <tagname>
可以刪除一個本地標籤; -
命令
git push origin :refs/tags/<tagname>
可以刪除一個遠程標籤。