Git版本控制常用命令學習彙總

前言

看完了廖雪峯老師的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>可以刪除一個遠程標籤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章