【git】第1篇:git面試以及經常使用命令操做

Git面試問題總結

git fetch和git pull的區別

  • git pull = fetch + merge
  • 使用git fetch是取回全部的最新的遠程分支更新,不會對本地執行merge操做,本地內容不會有變更;
  • git pull會更新你本地代碼變成服務器上對應分支的最新版本代碼;

git merge和git rebase的區別

參考答案:git merge和git rebase的區別html

git reset、git revert 和 git checkout 有什麼區別

這個問題一樣也須要先了解 git 倉庫的三個組成部分:工做區(Working Directory)、暫存區(Stage)和歷史記錄區(History)。git

共同點

用來撤銷代碼倉庫中的某些更改。面試

不一樣點

從 commit 層面來講:

git reset 能夠將一個分支的末端指向以前的一個 commit 點。而後再下次 git 執行垃圾回收的時候,會把這個 commit 以後的 commit 都扔掉。git reset 還支持三種標記,用來標記 reset 指令影響的範圍:安全

--mixed:會影響到暫存區和歷史記錄區。也是默認選項;服務器

--soft:隻影響歷史記錄區;app

--hard:影響工做區、暫存區和歷史記錄區。fetch

注意:由於 git reset 是直接刪除 commit 記錄,從而會影響到其餘開發人員的分支,因此不要在公共分支(好比 develop)作這個操做。.net

git revert 和 git reset 的目的是同樣的,可是作法不一樣,它會以建立新的 commit 的方式來撤銷 commit,這樣能保留以前的 commit 歷史,比較安全。另外,一樣由於可能會覆蓋本地的修改,因此執行這個指令以前,你須要 stash 或者 commit 暫存區和工做區的更改。code

git checkout 能夠將 HEAD 移到一個新的分支,並更新工做目錄。由於可能會覆蓋本地的修改,因此執行這個指令以前,你須要 stash 或者 commit 暫存區和工做區的更改。server

從文件層面來講

git reset 只是把文件從歷史記錄區拿到暫存區,不影響工做區的內容,並且不支持 --mixed、--soft 和 --hard。

git checkout 則是把文件從歷史記錄拿到工做區,不影響暫存區的內容。

git revert 不支持文件層面的操做。

回答關鍵點:

  • 對於 commit 層面和文件層面,這三個指令自己功能差異很大。
  • git revert 不支持文件層面的操做。
  • 不要在公共分支作 git reset 操做。

Git命令

Git配置相關

/*設置用戶的姓名,用於每次的commit*/
git config - - global user.name "John Simth"
/*設置用戶的郵箱,用於每次的commit*/
git config - - global user.email john@example.com

Git倉庫的建立

/*將現有的項目轉變爲Git倉庫或者新建一個空的倉庫*/
git init
/*克隆倉庫*/
git clone '遠程倉庫地址'

Git的基本操做

提交

/*將單個文件添加到暫存區中*/
git add 'filename'
/*將當前全部文件添加到暫存區中*/
git add .
/*提交文件*/
git commit -m "comment"
/*添加並提交文件*/
git commit -a -m "comment"

Git分支操做

建立、刪除分支

git branch                    //查看全部分支
git branch <name>             //建立分支
git checkout <name>           //切換分支
git checkout -b <name>        //建立並切換分支

git branch -d <name>          //刪除分支,沒法刪除未被合併的分支
git branch -D <name>          //強制刪除分支,能夠刪除未被合併的分支

分支合併

git merge <branch>             //將branch分支合併到當前分支,當前分支擁有branch分支的記錄,branch分支不變
git merge <branch1> <branch2>  //將分支branch1合併到branch2
/*git默認使用fast-farward快合併模式,會直接將要被合併的分支指向當前分支;
 *可是--no-ff不會,它會建立合併點;
 **/
git merge --no-ff <branch>
/*將兩個分支合併成一個線性的提交*/
git rebase <branch>

git merge和git rebase的區別

查看狀態或記錄

/**
 *顯示文件的狀態: staged,unstaged和untracked三種狀態
 *untracked:表示版本庫中有新建立的文件,可是併爲歸入版本庫的管理中
 *unstaged:將untracked狀態的文件執行 git add 命令後文件狀態就是unstaged,此時 
 *意味着git發現這個文件被改動了,可是改動的部分並無提交到倉庫中
 *staged:表示文件已經被提交到倉庫中了
 **/
git status
/*顯示當前分支的commit記錄*/
git log
/*以圖的形式顯示當前分支的commit記錄*/
git log --graph

比較

/*工做區與暫存區之間的差異,即尚未添加到暫存區的修改,這裏比較的是修改內容*/
git diff
/*暫存區與上一次提交的差異*/
git diff --cached
/*比較兩次commit之間的差異*/
git diff <commit id1> <commit id2>
/*比較兩個分支之間的差異*/
git diff <branch1> <branch2>

回退

/*將HEAD移動到commit id對應的提交點*/
git reset <commit id>
/*工做區、暫存區和歷史記錄區都會被重置commit id提交點*/
git reset --hard <commit id>

撤銷

保存修改

git stash                     //保存當前工做區和暫存區的狀態
git stash list                //查看全部的stash信息
git stash apply <stash>       //回覆指定stash,但不刪除該stash記錄
git stash drop <stash>        //刪除指定stash
git stash clear               //刪除全部stash記錄

標籤

git tag <name>                 //給最新提交打標籤
git tag <name> <commit_hash>   //給commit_hash提交打標籤
git tag                        //查看全部標籤
git show <name>                //查看標籤信息
git checkout <tagname>         //切換到標籤
git tag -d <tagname>           //能夠刪除一個本地標籤
 
git push --tags                //把本地tag push到遠端
git fetch origin tag <tagname> //獲取遠程tag
git push origin --delete tag <tagname>  //刪除遠程tag

Git遠程倉庫操做

關聯遠程倉庫

git remote add origin git@server-name:path/repo-name.git
git push -u origin master
git push origin master
相關文章
相關標籤/搜索