「本文已參與好文召集令活動,點擊查看:後端、大前端雙賽道投稿,2萬元獎池等你挑戰!」前端
做爲一名工程師,既然想要加入一個團隊,並肩做戰地協同開發項目,就必不可少要學會Git基本操做。面試過程當中,面試官不止是考察1-3年的工程師,高級崗位也一樣會考察團隊協做的能力。相信小夥伴們常常會在面試中被問到如下問題吧,能夠幫助你測試一下你的Git基礎牢不牢固。git
git fetch
和git pull
有什麼區別,有合併操做嗎?git merge
和git rebase
有什麼區別,它們的應用場景有哪些?git reset
和git revert
有什麼區別,該如何選擇,回滾後的<commit-id>
還能找到嗎?若是你心中已有答案,那麼能夠選擇跳過這篇文章啦,愉快地繼續摸魚~github
若是你對這些概念還有些模糊,或者沒有實際操做過,那麼就須要好好閱讀本篇文章啦!面試
接下來立刻進入正文啦,本文分四個部分介紹,你們能夠自由選擇閱讀。後端
畫了一個簡單的示意圖,供你們參考緩存
git add
後,工做區的文件就會被移入暫存區,表示哪些文件準備被提交,當完成某個功能後須要提交代碼,能夠經過 git add
先提交到暫存區。如下命令遠程主機名默認爲origin
,若是有其餘遠程主機,將origin
替換爲其餘便可。bash
# 獲取遠程倉庫特定分支的更新
git fetch origin <分支名>
# 獲取遠程倉庫全部分支的更新
git fetch --all
複製代碼
# 從遠程倉庫拉取代碼,併合併到本地,至關於 git fetch && git merge
git pull origin <遠程分支名>:<本地分支名>
# 拉取後,使用rebase的模式進行合併
git pull --rebase origin <遠程分支名>:<本地分支名>
複製代碼
注意服務器
git fetch + git merge FETCH_HEAD
,執行效果就是會拉取全部分支信息回來,可是隻合併當前分支的更改。其餘分支的變動沒有執行合併。# 基於當前分支,新建一個本地分支,但不切換
git branch <branch-name>
# 查看本地分支
git branch
# 查看遠程分支
git branch -r
# 查看本地和遠程分支
git branch -a
# 刪除本地分支
git branch -D <branch-name>
# 基於舊分支建立一個新分支
git branch <new-branch-name> <old-branch-name>
# 基於某提交點建立一個新分支
git branch <new-branch-name> <commit-id>
# 從新命名分支
git branch -m <old-branch-name> <new-branch-name>
複製代碼
# 切換到某個分支上
git checkout <branch-name>
# 基於當前分支,建立一個分支並切換到新分支上
git checkout -b <branch-name>
複製代碼
# 添把當前工做區修改的文件添加到暫存區,多個文件能夠用空格隔開
git add xxx
# 添加當前工做區修改的全部文件到暫存區
git add .
複製代碼
# 提交暫存區中的全部文件,並寫下提交的概要信息
git commit -m "message"
# 相等於 git add . && git commit -m
git commit -am
# 對最近一次的提交的信息進行修改,此操做會修改commit的hash值
git commit --amend
複製代碼
# 推送提交到遠程倉庫
git push
# 強行推送到遠程倉庫
git push -f
複製代碼
# 查看全部已打上的標籤
git tag
# 新增一個標籤打在當前提交點上,並寫上標籤信息
git tag -a <version> -m 'message'
# 爲指定提交點打上標籤
git tag -a <version> <commit-id>
# 刪除指定標籤
git tag -d <version>
複製代碼
HEAD表示最新提交 ;HEAD^表示上一次; HEAD~n表示第n次(從0開始,表示最近一次)markdown
git pull
拉取遠程倉庫的最新代碼git add .
添加修改的文件到暫存區git commit -m 'message'
提交到本地倉庫git push
將本地倉庫的修改推送到遠程倉庫自動建立一個新的合併提交點merge-commit
,且包含兩個分支記錄。若是合併的時候遇到衝突,僅須要修改解決衝突後,從新commit。app
git checkout master
git merge dev
複製代碼
git merge --ff
(默認--ff,fast-farward)
git merge --no-ff
(不快速合併、推薦)
git merge --squash
(把屢次分支commit歷史壓縮爲一次)
merge commit
,變換起始點位置,「整理」成一條直線,且能使用命令合併屢次commit。git rebase master
就會拉取到master上的最新代碼合併進來,也就是將分支的起始時間指向master上最新的commit上。自動保留的最新近的修改,不會遇到合併衝突。並且可交互操做(執行合併刪除commit),可經過交互式變基來合併分支以前的commit歷史git rebase -i HEAD~3
git rebase master
整理本身的dev變成一條線。頻繁進行了git commit提交,可用交互操做drop
刪除一些提交,squash
提交融合前一個提交中。git checkout dev
git rebase master
複製代碼
git rebase master
,將dev的屢次commit一塊兒拉到要master最新提交的後面(時間最新),變成一條線,多用於整理本身的dev提交歷史,而後把master最新代碼合進來。git merge feature-a
git rebase dev
# 取消merge合併
git merge --abort
# 取消rebase合併
git rebase --abort
複製代碼
git checkout
git reset
--hard
:硬重置,影響【工做區、暫存區、本地倉庫】--mixed
:默認,影響【暫存區、本地倉庫】,被重置的修改內容還留在工做區--soft
:軟重置,影響 【本地倉庫】,被重置的修改內容還留在工做區和暫存區git revert
# 撤回工做區該文件的修改,多個文件用空格隔開
git checkout -- <file-name>
# 撤回工做區全部改動
git checkout .
# 放棄已git add到暫存區的指定文件的緩存(HEAD表示最新版本)
git reset HEAD <file-name>
# 放棄全部的緩存
git reset HEAD .
# 丟棄已commit的其餘版本,hard參數表示同時重置工做區的修改
git reset --hard <commit-id>
# 回到上一個commit的版本,hard參數表示同時重置工做區的修改
git reset --hard HEAD^
# 撤銷0ffaacc此次提交
git revert 0ffaacc
# 撤銷最近一次提交
git revert HEAD
# 撤銷最近2次提交,注意:數字從0開始
git revert HEAD~1
# 回退後要執行強制推送遠程分支
git push -f
複製代碼
git cherry-pick
git merge
將全部提交點合併進來,就須要使用這個git cherry-pick
。git cherry-pick <commit-id>
複製代碼
git stash
# 將本地改動的暫存起來
git stash
# 將未跟蹤的文件暫存(另外一種方式是先將新增的文件添加到暫存區,使其被git跟蹤,就能夠直接git stash)
git stash -u
# 添加本次暫存的備註,方便查找。
git stash save "message"
# 應用暫存的更改
git stash apply
# 刪除暫存
git stash drop
# 應用暫存的更改,而後刪除該暫存,等價於git stash apply + git stash drop
git stash pop
# 刪除全部緩存
git stash clear
# 查看緩存列表
git stash list
複製代碼
git log
能夠顯示全部提交過的版本信息,若是感受太繁瑣,能夠加上參數 --pretty=oneline
,只會顯示版本號和提交時的備註信息。
git reflog
git reflog
能夠查看全部分支的全部操做記錄(包括已經被刪除的 commit 記錄和 reset 的操做),例如執行 git reset --hard HEAD~1
,退回到上一個版本,用git log是看不出來被刪除的,用git reflog
則能夠看到被刪除的,咱們就能夠買後悔藥,恢復到被刪除的那個版本。
ssh-keygen -t rsa -C "郵箱地址"
cd ~/.ssh
切換到home下面的ssh目錄、cat id_rsa.pub
命令查看公鑰的內容,而後複製settings
-> SSH and GPG keys
-> 複製剛纔的內容貼入 -> Add SSH key
git config --global user.name "xxx"
git config --global user.email "xxx@xx.com"
閱讀到這裏,是否是感受對Git相關概念更加清晰了呢,那麼恭喜你,不再怕由於誤操做,丟失同事辛辛苦苦寫的代碼了,並且將在平常工做的協同中游刃有餘。