前言

之前也工作了一段時間,但是對於git的使用基本上停留在 pull、add 、commit、push 上,也沒有進行基本的整理,有一次某大廠同事讓我複製他的一個commit到我的分支,我實在不知道怎麼複製,也愣頭青不好意思問,就把那個分支自己一點一點的改動複製過來,他看到我的操作後吃驚的表情我到現在還記得,整理一下大廠常用的git高級命令(git cherry-pickgit revertgit rebasegit branchgit checkoutgit stash),以後媽媽再也不用擔心我被同事嘲笑不會git了。

一、git clone 克隆遠端倉庫到本地

  • 不指定分支克隆
git clone 倉庫地址
  • 指定分支克隆
git clone -b 分支名 倉庫地址

二、git fetch 拉取倉庫最新分支信息

git fetch origin

三、git log 查看當前分支提交日誌

git log

四、git add 將本地的changes進行暫存,暫存後可為後續提交做準備

  • 將單個文件放置到暫存區
git add 文件名
  • 將所有changes放置到暫存區
git add .

五、git commit 將暫存區文件提交至本地倉庫

  • 該命令之後對加入暫存區的文件生效,即通過git add 命令後的文件才會被提交至本地倉庫
  • 如果只想提交暫存區中的某些文件,我們可以使用如下命令
git commit  文件名 文件名
  • 該命令可以填寫一條提交信息 若只使用 git commit 那麼會將所有在暫存區的文件提交至本地倉庫,且會進入vim的命令行進行提交信息的填寫。
  • 我們可以使用如下命令來進行編輯提交信息
git commit -m "這是我本次的提交信息"
  • 有人可能會覺得每次都需要使用git add之後才能使用git commit不方便,其實也為我們提供了簡寫方式如下:
git  commit -a -m "這是我本次的提交信息"

使用上述命令,我們可以直接對所有的changes進行提交,個人並不建議使用該命令,因為有些changes可能並不適合本次提交而是應該放到另一個commit中,我們可以針對本次需要提交的changes添加到暫存區然後再進行提交。

六、git pull 將遠程倉庫拉取到本地併合並

  • 我們可以使用如下代碼進行拉取
git pull origin 遠程分支名:要合併的本地分支名
  • 一般來説我們的本地分支名跟遠程分支名是相同的,因此我們可以將本地分支名跟遠程分支名進行合併然後省略冒號如下:
git pull origin 分支名

七、git push 將本地倉庫推送至遠程倉庫併合並

  • 該命令可以將我們本地的倉庫推送至遠程倉庫供其他人拉取合併等操作
  • 我們可以使用如下代碼進行推送
git push origin 本地分支名:遠程分支名
  • 一般來説我們的本地分支名跟遠程分支名是相同的,因此我們可以將本地分支名跟遠程分支名進行合併然後省略冒號如下:
git push origin 分支名
  • 如果本地分支跟遠程分支有衝突是推送不上去的,我們可以使用如下命令來強制推送:
git push --force origin 分支名

簡寫

git push -f origin 分支名

若多人共同開發一個分支,強制推送有可能覆蓋他人代碼,需慎用!!!

八、git branch 處理分支相關操作

  • 查看分支列表
git branch -a

該命令可查看當前倉庫下存在的分支名列表

  • 創建分支
git branch 分支名
  • 刪除分支(首先需要切到不是要刪除的分支上去)
  • 刪除本地分支
  • 刪除本地未推到遠程倉庫的分支(強制刪除本地分支)
git branch -D 分支名
  • 刪除本地已經推到遠程倉庫的分支
git branch -d 分支名
  • 刪除遠程倉庫分支
  • 完整語法
git push origin --delete 分支名
  • 簡寫(使用 : 代替了 --delete 且沒有空格)
git push origin :分支名

九、git checkout 切換分支

  • 首先本地先拉取到最新的分支list後可通過該命令切換分支
git checkout 分支名
  • 切換到新創建分支(該語法其實是先從當前分支新建分支然後切到該分支是git branch 分支名git checkout 分支名的結合)
git checkout -b 分支名

十、git cherry-pick 複製某個commit到該分支

  • 有時候我們會有這樣的訴求,跟同事在不同的分支開發,你們兩個的需求都還沒有開發完成不能合碼,但是你需要他的已開發的一次commit的內容,我們不可能跟同事去重複開發一份,此時我們可以使用該命令。其中commit的id可以從我們的倉庫提交中查看到,或是使用git log查看提交日誌,裏面的記錄就有提交的commit的id。
git cherry-pick  需要複製過來的commit的id

執行完這個命令後,同事的commit便會同步到你這個分支上,你便可以使用同事開發的功能了。

十一、git reset 回滾commit

  • 有時候我們在開發時,剛在提交了代碼便發現剛才的提交有個明顯bug或是剛才的提交漏了部分東西,我們當然可以再提交一個commit來修改發現的問題,但是如果這幾次提交只是為了解決同一個問題,那麼並不建議提交多個commit,可以在本地回滾代碼修改好了之後再次提交,命令如下:
git reset 想要回滾到的commit的id

修改完了之後重新提交即可。
如果我們在本地開發還未推送至遠程倉庫,那麼以上代碼足矣。

  • 已推送至遠程倉庫後,我們回滾後會發現無法push上去,原因是因為我們本地的分支通過回滾已經落後遠程分支,此時我們可以使用git push -f origin 分支名強制推送。
  • 永遠記住只要涉及強制推送必須慎用。

十二、git revert 以一次完全相反的commit提交來回滾某個commit提交

  • 有時候我們提交了一個commit,在此之後,同事又在你的提交之後提交了他的commit,我們發現我們提交的commit有問題,或是產品説這個需求本次不跟車,那麼我們的代碼已經合進去了怎麼辦呢?我們此時可以使用該命令來提交一個與我們之前的commit 完全相反的commit 來抵消掉之前的提交。命令如下:
git revert 需要撤回commit的id
  • 有人可能會問git resetgit revert有什麼區別呢?我們要知道,reset意為重置,在之後的commit會全部進行丟棄也不會有任何提交記錄,revert會使用一個commit來抵消之前的commit,是有記錄的,我們也不需要進行強制推送,以此來做到不發生更改的目的。

十三、git rebase 使用該命令來減少commit

  • 有一篇文章寫的很好點擊這裏學習git rebase

十四、git stash 貯藏當前changes

  • 有時候我們正在開發一個需求,還沒開發完,我們要去另一個分支開發,我們沒法切分支重新拉代碼,它要求我們必須提交到本地倉庫才能拉代碼,所以此時我們可以將我們在本分支的changes先貯藏起來然後切分支,命令如下:
git stash
  • 使用該命令後我們做的changes就會被貯藏起來,我們可以到任何分支去拉代碼或是修改,因為我們之前做的changes已經藏起來了,對外界是不可見的。
  • 假設我們的另一個需求做完了,我們現在要切回原分支繼續開發,我們可以先切到原分支,然後使用如下命令:
git stash pop
  • 上述命令會彈出我們最後一次貯藏的changes,一般來説使用這個命令足夠了,有時我們可能想要把所有貯藏的changes一起應用到當前分支,那麼我們可以使用如下命令:
git stash apply
  • 當然我們也可以查看貯藏的changes,命令與結果分別如下:
git  stash list
$ git stash list
    stash@{0}: WIP on master: 049d078 added the index file
    stash@{1}: WIP on master: c264051 Revert "added file_size"
    stash@{2}: WIP on master: 21d80a5 added number to log
  • 刪除某個stash自然也是可以的使用 git stash drop 貯藏的名字
git stash drop stash@{0}
  • 刪除全部stash
git stash clear

上述命令平時的工作絕對夠了,還有一些查看diff命令用的很少,我從來沒用到,在此不做贅述。

希望每個人都不會因為git使用不熟練被同事嘲笑,最後祝大家編碼順利,不出bug!