git diff
比較區(qū)別
1,當工作區(qū)有改動的時候,臨時區(qū)為空(沒有進行git add),那么diff的對比是和上次的commit的記錄進行對比的。
2,當工作區(qū)有改動,臨時區(qū)有東西的時候,diff是和臨時區(qū)進行比較的。
git remote的相關命令
git remote命令讓我們可以創(chuàng)建, 查看, 刪除一個到其他倉儲的連接。
用法
git remote
列出來你的倉儲有哪些遠程連接.git remote -v
和上面的命令類似, 但是他列出了每個連接的url地址.git remote add <name> <url>
創(chuàng)建一個到遠程倉儲的連接. 添加后你可以使用<name>做為<url>的一個別名.git remote rm <name>
刪除一個遠程連接git remote rename <old-name> <new-name>
修改遠程連接的別名.git remote set-url origin <URL>
更換遠程倉庫地址。把<URL>更換為新的url地址。
git pull 與 git clone的區(qū)別
從字面意思理解,都是往下拉代碼,git clone是克隆,git pull 是拉。
但是,也有區(qū)別:
從遠程服務器克隆一個一模一樣的版本庫到本地,復制的是整個版本庫,叫做clone.(clone是將一個庫復制到你的本地,是一個本地從無到有的過程)
從遠程服務器獲取到一個branch分支的更新到本地,并更新本地庫,叫做pull.(pull是指同步一個在你本地版本對應的遠程庫內(nèi)容更新的部分到你的本地庫)
git pull
git pull命令的作用是,取回遠程主機某個分支的更新,再與本地的指定分支合并。
完整格式:$ git pull <遠程主機名> <遠程分支名>:<本地分支名>
完整格式舉例:比如,取回origin主機的next分支,與本地的master分支合并,需要寫成下面這樣,
- $ git pull origin next:master:如果遠程分支是與當前分支合并,則冒號后面的部分可以省略。
- $ git pull origin next:上面命令表示,取回origin/next分支,再與當前分支合并。實質(zhì)上,這等同于先做git fetch,再做git merge。
$ git fetch origin
$ git merge origin/next
在某些場合,Git會自動在本地分支與遠程分支之間,建立一種追蹤關系(tracking)。比如,在git clone的時候,所有本地分支默認與遠程主機的同名分支,建立追蹤關系,也就是說,本地的master分支自動”追蹤”origin/master分支。
Git也允許手動建立追蹤關系,git branch --set-upstream master origin/next
上面命令指定master分支追蹤origin/next分支。如果當前分支與遠程分支存在追蹤關系,git pull就可以省略遠程分支名。
git pull origin
上面命令表示,本地的當前分支自動與對應的origin主機”追蹤分支”(remote-tracking branch)進行合并。
如果當前分支只有一個追蹤分支,連遠程主機名都可以省略。
get clone
遠程操作的第一步,通常是從遠程主機克隆一個版本庫,這時就要用到git clone命令。
- $ git clone <版本庫的網(wǎng)址>
比如,克隆jQuery的版本庫。
$ git clone https://github.com/jquery/jquery.git
該命令會在本地主機生成一個目錄,與遠程主機的版本庫同名。如果要指定不同的目錄名,可以將目錄名作為git clone命令的第二個參數(shù)。
- $ git clone <版本庫的網(wǎng)址> <本地目錄名>
git clone支持多種協(xié)議,除了HTTP(s)以外,還支持SSH、Git、本地文件協(xié)議等,下面是一些例子。
$ git clone http[s]://example.com/path/to/repo.git/
$ git clone ssh://example.com/path/to/repo.git/
$ git clone git://example.com/path/to/repo.git/
$ git clone /opt/git/project.git
$ git clone file:///opt/git/project.git
$ git clone ftp[s]://example.com/path/to/repo.git/
$ git clone rsync://example.com/path/to/repo.git/
- SSH協(xié)議還有另一種寫法。
$ git clone [user@]example.com:path/to/repo.git/
通常來說,Git協(xié)議下載速度最快,SSH協(xié)議用于需要用戶認證的場合。
分支的相關命令
git branch
查看有幾個分支git branch branchA
創(chuàng)建分支git checkout branchA
切換分支git merge branchA
合入分支代碼git branch -d branchA
刪除分支git checkout -b dev
此處其實是兩步git branch dev加上git checkout dev
使用git 配置用戶名和郵箱
- git config --global user.name [username]
- git config --global user.email [email]
如果你傳遞了 --global 選項,則Git將總是會使用該信息來處理你在系統(tǒng)中所做的一切操作。如果你希望在一個特定的項目中使用不同的名稱或e-mail地址,你可以在該項目中運行該命令而不要--global選項。
使用git config --list查看已設配置
- git查看用戶名和郵箱地址
$ git config user.name
$ git config user.email
git log --graph
-graph標記會畫出一個ASCII圖展示commit歷史的分支結(jié)構(gòu)
處理沖突
git rebase處理沖突
假定采用的是git rebase,則處理過程為:
git rebase dev
將dev上的c2、c5在master分支上做一次衍合處理
git提示出現(xiàn)了代碼沖突,此處為之前埋下的沖突點,處理完畢后git add readme
添加沖突處理后的文件git rebase --continue
加上--continue參數(shù)讓rebase繼續(xù)處理
git rebase的特點
(交互式) 使用rebase命令合并分支,解決完沖突,執(zhí)行git add .和git rebase --continue,不會產(chǎn)生額外的commit。
這樣的好處是,‘干凈’,分支上不會有無意義的解決分支的commit;
壞處,如果合并的分支中存在多個commit,需要重復處理多次沖突。
git merge 處理沖突
(一股腦)使用merge命令合并分支,解決完沖突,執(zhí)行git add .和git commit -m'fix conflict'。這個時候會產(chǎn)生一個commit。
注意
1、我自己嘗試merge命令后,發(fā)現(xiàn):merge時并沒有產(chǎn)生一個commit。不是說merge時會產(chǎn)生一個merge commit嗎?
注意:只有在沖突的時候,解決完沖突才會自動產(chǎn)生一個commit。
如果想在沒有沖突的情況下也自動生成一個commit,記錄此次合并就可以用:git merge --no-ff命令。
merge和rebase的區(qū)別
補充:
- 當我們使用Git log來參看commit時,兩者commit的順序也有所不同。
- 用merge確實只需要解決一遍沖突,比較簡單粗暴;用rebase有時候會需要多次fix沖突(原因在于本地分支已經(jīng)提交了非常多的commit,而且很久都沒有和上游合并過)
rebase和merge的使用場景
兩個使用場景是不一樣的,merge只是合并另外一個分支的內(nèi)容,rebase也合并另外一個分支的內(nèi)容,但是會把本分支的commits頂?shù)阶铐敹?/strong>
另外,單獨使用rebase,還有調(diào)整當前分支上commits的功能(合并,丟棄,修改commites msg)
參考:https://www.zhihu.com/question/36509119/answer/67828312
git stash和git stash pop
場景:工作一半修線上bug時使用
git stash 可用來暫存當前正在進行的工作, 比如想pull 最新代碼, 又不想加新commit, 或者另外一種情況,為了fix 一個緊急的bug, 先stash, 使返回到自己上一個commit, 改完bug之后再stash pop, 繼續(xù)原來的工作。
pull request 功能
- code review
- communication
當你想更正別人倉庫里的錯誤時,要走一個流程:
- 先 fork 別人的倉庫,相當于拷貝一份,相信我,不會有人直接讓你改修原倉庫的
- clone 到本地分支,做一些 bug fix
- 發(fā)起 pull request 給原倉庫,讓他看到你修改的 bug
- 原倉庫review 這個 bug,如果是正確的話,就會 merge 到他自己的項目中
參考:https://www.zhihu.com/question/21682976
fork功能
fork 別人的倉庫到自己的github賬號下,相當于拷貝一份
git revert和git reset head
git revert
git revert 是生成一個新的提交來撤銷某次提交,此次提交之前的commit都會被保留
git revert <commit log string>是撤消該commit,作為一個新的commit。
git reset
現(xiàn)在我們啟動時光穿梭機,準備把readme.txt回退到上一個版本:
首先,Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交
上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數(shù)不過來,所以寫成HEAD~100。
所以git reset head^就是回退到上一個版本。
git reset的相關參數(shù)
除了在當前分支上操作,還可以通過傳入這些標記來修改你的緩存區(qū)或工作目錄:
--soft – 緩存區(qū)和工作目錄都不會被改變
--mixed – 默認選項。緩存區(qū)和你指定的提交同步,但工作目錄不受影響
--hard – 緩存區(qū)和工作目錄都同步到你指定的提交
注意
- 當你傳入HEAD以外的其他提交的時候要格外小心,因為reset操作會重寫當前分支的歷史。正如Rebase黃金法則所說的,在公共分支上這樣做可能會引起嚴重的后果。
- 使用git reset是不影響遠程分支的,一切都在本地發(fā)生。
總結(jié):
HEAD指向的版本就是當前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id。穿梭前,用
git log可以查看提交歷史,以便確定要回退到哪個版本。要重返未來,用
git reflog查看命令歷史,以便確定要回到未來的哪個版本。
git reset head 參考:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013744142037508cf42e51debf49668810645e02887691000