How to use Git

版本控制

版本控制就是控制版本,版本控制系統(tǒng)幫助控制(管理)某個(gè)事物(通常指源代碼)的不同版本
現(xiàn)在流行的版本控制:

  • git
  • Subversion
  • Mercurial
    版本控制系統(tǒng)分為兩個(gè)類別:Centralized and Distributed (集中式模型和分布式模型)


版本控制系統(tǒng)的主要目的是幫助你保留項(xiàng)目的詳細(xì)歷史記錄豁翎,并且能夠在不同的版本上進(jìn)行工作薪鹦。保留詳細(xì)的項(xiàng)目歷史記錄很重要警检,因?yàn)檫@樣可以看出一段時(shí)間內(nèi)項(xiàng)目的進(jìn)度傻挂。如果需要,你還可以回到項(xiàng)目的某個(gè)階段检碗,并恢復(fù)數(shù)據(jù)或文件据块。

版本控制術(shù)語
  • 提交(Commit)
    Git 將數(shù)據(jù)看做微型文件系統(tǒng)的一組快照。每次 commit(在 Git 中保持項(xiàng)目狀態(tài))后裸,它都對(duì)文件當(dāng)時(shí)的狀況拍照瑰钮,并存儲(chǔ)對(duì)該快照的引用冒滩。你可以將其看做游戲中的保存點(diǎn)微驶,它會(huì)保存項(xiàng)目的文件和關(guān)于文件的所有信息。
  • 倉庫(Repository / repo)
    倉庫是一個(gè)包含項(xiàng)目內(nèi)容以及幾個(gè)文件(在 Mac OS X 上默認(rèn)地處于隱藏狀態(tài))的目錄,用來與 Git 進(jìn)行通信因苹。倉庫可以存儲(chǔ)在本地苟耻,或作為遠(yuǎn)程副本存儲(chǔ)在其他計(jì)算機(jī)上。倉庫是由 commit 構(gòu)成的扶檐。
  • 工作目錄 / 工作區(qū)(Working Directory)
    工作目錄是你在計(jì)算機(jī)的文件系統(tǒng)中看到的文件凶杖。當(dāng)你在代碼編輯器中打開項(xiàng)目文件時(shí),你是在工作目錄中處理文件
  • 檢出(Checkout)
    檢出是指將倉庫中的內(nèi)容復(fù)制到工作目錄下款筑。
  • 暫存區(qū) / 暫存索引 / 索引(Staging Area / Staging Index / Index)
    Git 目錄下的一個(gè)文件智蝠,存儲(chǔ)的是即將進(jìn)入下個(gè) commit 內(nèi)容的信息∧问幔可以將暫存區(qū)看做準(zhǔn)備工作臺(tái)杈湾,Git 將在此區(qū)域獲取下個(gè) commit。暫存索引中的文件是準(zhǔn)備添加到倉庫中的文件攘须。
  • SHA
    SHA 是每個(gè) commit 的 ID 編號(hào)漆撞。以下是 commit 的 SHA 示例:e2adf8ae3e2e4ed40add75cc44cf9d0a869afeb6
  • 分支(Branch)
    分支是從主開發(fā)流程中分支出來的新的開發(fā)流程。這種分支開發(fā)流程可以在不更改主流程的情況下繼續(xù)延伸下去于宙。
配置git
# 設(shè)置你的 Git 用戶名
git config --global user.name "<Your-Full-Name>"

# 設(shè)置你的 Git 郵箱
git config --global user.email "<your-email-address>"

# 確保 Git 輸出內(nèi)容帶有顏色標(biāo)記
git config --global color.ui auto

# 對(duì)比顯示原始狀態(tài)
git config --global merge.conflictstyle diff3

git config --list
Git 與代碼編輯器

最后一個(gè)配置步驟是讓 Git 能與你的代碼編輯器結(jié)合使用浮驳。以下是三個(gè)最熱門的代碼編輯器。如果你使用的是其他編輯器捞魁,則在 Google 中搜索“修改 Git 默認(rèn)編輯器為 X 編輯器”(將 X 替換為你的代碼編輯器的名稱)至会。
Atom Editor 設(shè)置

git config --global core.editor "atom --wait"

Sublime Text 設(shè)置

git config --global core.editor "'C:/Program Files/Sublime Text 2/sublime_text.exe' -n -w"

VSCode 設(shè)置

git config --global core.editor "code --wait"
創(chuàng)建git倉庫

在對(duì) Git 倉庫進(jìn)行 commit 或執(zhí)行任何其他操作之前,需要一個(gè)實(shí)際存在的倉庫谱俭。要使用 Git 新建一個(gè)倉庫奋献,我們將使用 git init命令。
init 子命令是"initialize"(初始化)的簡稱旺上,這個(gè)命令很有用瓶蚂,因?yàn)樗鼘⑦M(jìn)行所有倉庫初始設(shè)置

  • ls - 用來列出文件和目錄
  • mkdir - 用來新建目錄
  • cd - 用來更改目錄
  • rmz- 用來刪除文件和目錄

使用 cd 可以更改工作目錄,使用 ls(單獨(dú)使用)會(huì)列出工作目錄下的文件宣吱。如果你忘記 shell 的當(dāng)前工作目錄窃这,可以使用 pwd 命令(表示 print working directory 輸出工作目錄)輸出該目錄的名稱。

git init 命令的作用

運(yùn)行 git init 命令會(huì)初始化 Git 跟蹤所有內(nèi)容會(huì)用到的所有必要文件和目錄征候。所有這些文件都存儲(chǔ)在叫做 .git(注意開頭有個(gè) .杭攻,表示在 Mac/Linux 上,它將是一個(gè)隱藏目錄)的目錄下疤坝。這個(gè) .git 目錄是一個(gè)庫兆解!Git 會(huì)將所有 commit 記錄在這里,并跟蹤所有內(nèi)容

克隆現(xiàn)有倉庫

在 Git 上進(jìn)行克隆的方法是調(diào)用我們將在終端上運(yùn)行的命令 git clone跑揉,然后傳入要克隆的 Git 倉庫的路徑(通常是 URL)锅睛。

驗(yàn)證終端位置
提示:在克隆任何內(nèi)容之前埠巨,確保命令行工具已定位于正確的目錄下∠志埽克隆項(xiàng)目會(huì)新建一個(gè)目錄辣垒,并將克隆的 Git 倉庫放在其中。問題是無法創(chuàng)建嵌套的 Git 倉庫印蔬。因此勋桶,確保終端的當(dāng)前工作目錄沒有位于 Git 倉庫中。如果當(dāng)前工作目錄沒有在 shell 的提示符中顯示侥猬,輸入 pwd 輸出工作目錄例驹。

判斷倉庫的狀態(tài)

git-status

  1. On branch master – 這部分告訴我們 Git 位于 master 分支上。你已在術(shù)語表中獲取了對(duì)分支的介紹退唠,那么這是"master"分支(也就是默認(rèn)分支)眠饮。我們將在第 5 節(jié)課深入了解分支。

  2. Your branch is up-to-date with 'origin/master'. – 因?yàn)槲覀兪褂?git clone 從另一臺(tái)計(jì)算機(jī)上復(fù)制了此倉庫铜邮,因此這部分告訴我們項(xiàng)目是否與所復(fù)制的倉庫保持同步狀態(tài)仪召。我們不會(huì)在其他計(jì)算機(jī)上處理該項(xiàng)目,因此這一行可以忽略松蒜。

  3. nothing to commit, working directory clean– 表示沒有任何待定的更改扔茅。

可以將這一輸出結(jié)果看作“休息狀態(tài)(resting state)”(這并不是官方解釋,只是我喜歡這么理解=彰纭)召娜。因?yàn)闆]有新的文件、沒有對(duì)文件作出更改惊楼、暫存區(qū)沒有任何需要 commit 的內(nèi)容……沒有更改或操作玖瘸,因此我喜歡將其稱為休息狀態(tài)。
該命令將:

  • 告訴我們已在工作目錄中被創(chuàng)建但 Git 尚未開始跟蹤的新文件
  • Git 正在跟蹤的已修改文件
查看倉庫的歷史記錄

git log顯示有關(guān)現(xiàn)有提交信息
git show顯示有關(guān)給定提交的信息檀咙,需要向其提交ID,也就是SHA

  • 要向下滾動(dòng)雅倒,按下
  • j 或 ↓ 一次向下移動(dòng)一行
  • d 按照一半的屏幕幅面移動(dòng)
  • f 按照整個(gè)屏幕幅面移動(dòng)
  • 要 向上滾動(dòng),按上
  • k 或 ↑ 一次向上移動(dòng)一行
  • u 按照一半的屏幕幅面移動(dòng)
  • b 按照整個(gè)屏幕幅面移動(dòng)
  • 按下 q 可以退出日志(返回普通的命令提示符)

顯示內(nèi)容:

  • SHA - git log 將顯示每個(gè) commit 的完整 SHA弧可。每個(gè) SHA 都是唯一的蔑匣,因此,我不需要查看整個(gè) SHA棕诵。只需知道前 6-8 個(gè)字符即可裁良。如果我們能只顯示 SHA 的前 5 個(gè)左右的字符,是不是會(huì)節(jié)省一些空間校套?

  • 作者 - git log 輸出結(jié)果顯示了每個(gè) commit 的作者价脾!其他倉庫可能有多個(gè)人協(xié)作,因此情況可能不同笛匙,但是對(duì)于此倉庫侨把,只有一個(gè)人提交了所有的 commit犀变,因此所有 commit 的作者是一樣的。我們需要查看每個(gè) commit 的作者嗎座硕?如果我們想隱藏這一信息呢弛作?

  • 日期 - 默認(rèn)情況下涕蜂,git log 將顯示每個(gè) commit 的日期华匾。但是我們真的關(guān)心 commit 的日期嗎?知道日期有時(shí)會(huì)很重要机隙,但是每次都知道日期并不十分重要蜘拉,在很多情況下都可以忽略。能否隱藏該信息有鹿,以便節(jié)省空間旭旭?

commit 消息 - 這是 commit 消息最重要的部分…我們通常都希望看到此信息,如何使輸出結(jié)果更簡短呢

git log命令有一個(gè)選項(xiàng),可以用來更改倉庫信息的顯示方式葱跋。該選項(xiàng)為 --oneline:

  • git log --oneline

此命令:

  • 每行顯示一個(gè) commit
  • 顯示 commit 的 SHA 的前 7 個(gè)字符
  • 顯示 commit 的消息

git log --stat 簡介


此命令會(huì):

  • 顯示被修改的文件
  • 顯示添加/刪除的行數(shù)
  • 顯示一個(gè)摘要持寄,其中包含修改/刪除的總文件數(shù)和總行數(shù)

git log -p
git log命令具有一個(gè)可用來顯示對(duì)文件作出實(shí)際更改的選項(xiàng)。該選項(xiàng)是 --patch娱俺,可以簡寫為 -p:

  • 添加的行所在的位置以及添加了多少行
  • -15,83 表示舊版本(用 - 表示)從第 15 行開始稍味,顯示了 83 行
  • +15,85 表示當(dāng)前版本(用 + 表示)從第 15 行開始,現(xiàn)在變成了 85 行...這 85 行顯示在下方
  • 在 commit 中實(shí)際進(jìn)行的更改
  • 用紅色標(biāo)示并以減號(hào) (-) 開頭的行是位于文件-
  • 原始版本中荠卷,但是被 commit 刪除的行
    用綠色標(biāo)示并以加號(hào) (+) 開頭的行是 commit 新加的行
查看特定的commit

顯示特定 commit 的詳情模庐,而不用關(guān)心倉庫中的所有其他內(nèi)容
實(shí)際上有兩種實(shí)現(xiàn)方式!

  • 向 git log 提供你要查看的 commit 的 SHA
  • 使用新的 git show 命令
  1. git log -p fdf5493
    通過提供 SHA油宜,git log -p 命令將從這條 commit 開始掂碱!無需滾動(dòng)并逐條查閱!注意慎冤,它還會(huì)顯示在所提供的 SHA 之前提交的所有 commit 信息疼燥。
  2. git show
    運(yùn)行上述示例命令將僅顯示最近的 commit。通常蚁堤,將 SHA 作為最后一個(gè)參數(shù)提供給命令:git show fdf5493
    git show 命令將僅顯示一個(gè) commit悴了。因此,如果你看不到任何其他 commit违寿,不要驚慌湃交。它只顯示一個(gè) commit。git show 命令的輸出和 git log -p 命令的完全一樣藤巢。因此默認(rèn)情況下搞莺,git show 會(huì)顯示:
  • commit
  • 作者
  • 日期
  • commit 消息
  • 補(bǔ)丁信息

但是,git show 可以與我們了解過的大部分其他選項(xiàng)一起使用:

  • --stat - 顯示更改了多少文件掂咒,以及添加/刪除的行數(shù)
  • -p 或 --patch - 顯示默認(rèn)補(bǔ)丁信息才沧,但是如果使用了 --stat迈喉,將不顯示補(bǔ)丁信息,因此傳入 -p 以再次添加該信息
  • -w - 忽略空格變化

向倉庫中添加commit

要將所有文件提交到倉庫中温圆,首先需要將這些文件從工作目錄移到暫存區(qū)挨摸。我們將使用 git add 命令將這三個(gè)文件移到暫存區(qū)。


使用 git addindex.html添加到暫存區(qū):

 git add index.html


輸出結(jié)果中現(xiàn)在出現(xiàn)了全新的區(qū)域:"Changes to be committed"區(qū)域岁歉!這一新的"Changes to be committed"區(qū)域顯示了位于暫存區(qū)的文件得运!目前只顯示了 index.html 文件,因此暫存區(qū)只有這個(gè)文件锅移。
git rm --cached 與 shell 的rm命令不同熔掺。git rm --cached 不會(huì)破壞任何屬于你的文件,它只是從暫存區(qū)刪掉了文件非剃。
此外置逻,幫助文本中出現(xiàn)了"unstage"(撤消暫存)字眼。將文件從工作目錄移到暫存區(qū)叫做"staging"(暫存)备绽。如果已移動(dòng)文件券坞,則叫做"staged"(已暫存)。從暫存區(qū)將文件移回工作目錄將"unstage"(撤消暫存)肺素。如果你閱讀的文檔中提示“stage the following files”恨锚,則表明你應(yīng)該使用 git add 命令。

index.html 文件已暫存压怠。我們?cè)贂捍媪硗鈨蓚€(gè)文件∶吒裕現(xiàn)在我們可以運(yùn)行以下命令:

$ git add css/app.css js/app.js

句點(diǎn) .
句點(diǎn)指代當(dāng)前目錄,可以用來表示所有文件和目錄(包括所有嵌套文件和目錄>薄)蜗顽。

    $ git add css/app.css js/app.js
    # 等同于
    $ git add .
git commit

第一段精確地告訴了我們需要執(zhí)行的操作 - 我們需要為該 commit 提供一條消息。此外 雨让,任何以字符 # 開頭的行將被忽略雇盖。在后面還提示:這將是初始 commit。最后栖忠,給出了將提交 commit 的文件列表崔挖。

因?yàn)檫@是存儲(chǔ)庫的第一個(gè) commit,我們將使用 commit 消息 "Initial commit"庵寞。文本 "Initial commit" 并不特殊狸相,只是第一個(gè) commit 的常用消息。如果你想使用其他消息捐川,完全可以脓鹃!

關(guān)鍵在于使每個(gè) commit 都有其側(cè)重點(diǎn)。每個(gè) commit 應(yīng)該記錄一項(xiàng)更改古沥。這種說法可能比較主觀(完全沒問題)瘸右,但是每個(gè) commit 應(yīng)該只對(duì)項(xiàng)目的一個(gè)方面做出更改娇跟。

git commit 小結(jié)

此命令:

  • 將打開配置中指定的代碼編輯器
  • 請(qǐng)參閱第一節(jié)課中的 git 配置流程,了解如何配置編輯器)
    在代碼編輯器中:
  • 必須提供提交說明
  • 以 # 開頭的行是注釋太颤,將不會(huì)被記錄
  • 添加提交說明后保存文件
  • 關(guān)閉編輯器以進(jìn)行提交

然后使用 git log檢查你剛剛提交的 commit苞俘!

git diff

git diff 命令可以用來查看已被加入但是尚未提交的更改。

.gitignore

如果你想將某個(gè)文件保留在項(xiàng)目的目錄結(jié)構(gòu)中龄章,但是確保它不會(huì)意外地提交到項(xiàng)目中吃谣,可以使用名稱特殊的文件 .gitignore(注意文件名開頭的點(diǎn),很重要M叨隆)基协。將此文件添加到 new-git-project項(xiàng)目根目錄歌亲。你只需列出希望 git ignore(忽略菇用,不跟蹤)的文件名,git 將忽略這些文件陷揪。
note: 可以使用touch .gitigore創(chuàng)建該文件

通配符允許你使用特殊的字符來表示某些格式/字符惋鸥。在 .gitignore 文件中,你可以使用

  • 空白行作為空格
  • # - 將行標(biāo)記為注釋
      • 與 0 個(gè)或多個(gè)字符匹配
  • ? - 與 1 個(gè)字符匹配
  • [abc] - 與 a悍缠、b 或 c 匹配
  • ** - 與嵌套目錄匹配 - a/**/z 與以下項(xiàng)匹配
    • a/z
    • a/b/z
    • a/b/c/z

標(biāo)簽卦绣、分支、合并

git tag

運(yùn)行 git tag -a v1.0 將為最近的 commit 添加標(biāo)簽飞蚓。但是如果你想向倉庫中很久之前的 Commit 添加標(biāo)簽?zāi)兀?br> 只需提供要添加標(biāo)簽的 commit 的 SHA 即可滤港!

$ git tag -a v1.0 a87984
git branch

git branch 命令用來與 git 的分支進(jìn)行交互:

  • 列出倉庫中的所有分支名稱
  • 創(chuàng)建新的分支
  • 刪除分支

要?jiǎng)?chuàng)建分支,只需使用 git branch 并提供要?jiǎng)?chuàng)建的分支對(duì)應(yīng)的名稱趴拧。因此溅漾,如果你想創(chuàng)建一個(gè)叫做"sidebar"的分支,只需運(yùn)行以下命令:
$ git branch sidebar

git checkout

注意著榴,在進(jìn)行 commit 時(shí)添履,該 commit 將添加到當(dāng)前分支上。雖然我們創(chuàng)建了新的 sidebar 分支脑又,但是沒有向其添加新的 commit暮胧,因?yàn)槲覀兩形辞袚Q到該分支。如果我們現(xiàn)在進(jìn)行 commit 的話问麸,該 commit 將添加到 master 分支往衷,而不是 sidebar 分支。我們已經(jīng)在演示中看到這一情況严卖,要在分支之間進(jìn)行切換席舍,我們需要使用 git 的 checkout 命令。

$ git checkout sidebar

請(qǐng)務(wù)必了解該命令的工作方式妄田。運(yùn)行該命令將:

  • 從工作目錄中刪除 git 跟蹤的所有文件和目錄
    (git 跟蹤的文件存儲(chǔ)在倉庫中俺亮,因此什么也不會(huì)丟失)
  • 轉(zhuǎn)到倉庫驮捍,并提取分支指向的 commit 所對(duì)應(yīng)的所有文件和目

日志中的分支
提示符中的分支信息很有用,但是最清晰的查看方式是查看git log的輸出結(jié)果脚曾。就像我們需要使用 --decorate 選項(xiàng)來顯示 git 標(biāo)簽一樣东且,我們也需要該選項(xiàng)來顯示分支。

$ git log --oneline --decorate

活躍分支
提示符將顯示活躍分支本讥。但這是我們對(duì)提示符進(jìn)行的特殊自定義珊泳,如果你使用的是不同的計(jì)算機(jī),判斷活躍分支的最快速方式是查看 git branch命令的輸出結(jié)果拷沸∩椋活躍分支名稱旁邊會(huì)顯示一個(gè)星號(hào)
刪除分支
分支用來進(jìn)行開發(fā)或?qū)?xiàng)目進(jìn)行修正,不會(huì)影響到項(xiàng)目(因?yàn)楦氖窃诜种线M(jìn)行的)撞芍。在分支上做出更改后米死,你可以將該分支組合到 master 分支上(這種“分支組合過程”叫做“合并”(merge),稍后將詳細(xì)講解)
合并了分支的更改后琐簇,你可能不再需要該分支了兔跌。如果你想刪除分支,可以使用 -d 選項(xiàng)帝嗡。下面的命令包含 -d 選項(xiàng)晶通,告訴 git 刪掉給出的分支(這里是"sidebar"分支)。
$ git branch -d sidebar
注意哟玷,無法刪除當(dāng)前所在的分支狮辽。因此要?jiǎng)h除 sidebar 分支,你需要切換到 master 分支巢寡,或者創(chuàng)建并切換到新的分支喉脖。

刪除內(nèi)容讓人比較緊張。但是不用擔(dān)心讼渊。如果某個(gè)分支上有任何其他分支上都沒有包含的 commit(也就是這個(gè) commit 是要被刪除的分支獨(dú)有的)动看,git 不會(huì)刪除該分支。如果你創(chuàng)建了 sidebar 分支爪幻,向其添加了 commit菱皆,然后嘗試使用 git branch -d sidebar 刪除該分支,git 不會(huì)讓你刪除該分支挨稿,因?yàn)槟銦o法刪除當(dāng)前所在的分支仇轻。如果你切換到 master 分支并嘗試刪除 sidebar 分支,git 也不會(huì)讓你刪除奶甘,因?yàn)?sidebar 分支上的新 commit 會(huì)丟失篷店!要強(qiáng)制刪除,你需要使用大寫的 D 選項(xiàng) - git branch -D sidebar。


同時(shí)查看所有分支
$ git log --oneline --decorate --graph --all

--graph 選項(xiàng)將條目和行添加到輸出的最左側(cè)疲陕。顯示了實(shí)際的分支方淤。--all 選項(xiàng)會(huì)顯示倉庫中的所有分支。

合并

當(dāng)你在主題分支上做出更改后蹄殃,如果覺得不想要該分支上的更改携茂,則可以刪掉該分支,或者你決定要保留更改诅岩,則可以將該分支上的更改與其他分支上的更改合并讳苦。

將分支組合到一起稱為合并
注意 git 中的兩種合并:普通合并和快進(jìn)合并。



但是如果你在錯(cuò)誤的分支上進(jìn)行了合并吩谦,可以使用以下命令撤消合并:

git reset --hard HEAD^
快進(jìn)合并

在我們的項(xiàng)目中鸳谜,我們檢出了 master 分支,我希望它擁有 footer 分支上的更改式廷。用語言描述的話就是“我想要合并 footer 分支咐扭。”懒棉。注意表述“合并…”草描;在進(jìn)行合并時(shí)览绿,另一個(gè)分支上的更改將出現(xiàn)在當(dāng)前檢出的分支上策严。

我再強(qiáng)調(diào)下,當(dāng)我們合并時(shí)饿敲,我們將其他分支合并到當(dāng)前(檢出的)分支上妻导。我們不是將兩個(gè)分支合并到一個(gè)新的分支上。也不是將當(dāng)前分支合并到其他分支上怀各。

因?yàn)?footer 直接在 master 前面倔韭,因此這種合并最簡單。將 footer 合并到 master 中將導(dǎo)致快進(jìn)合并(Fast-forward merge)瓢对∈僮茫快進(jìn)合并將使當(dāng)前檢出的分支向前移動(dòng),直到它指向與另一個(gè)分支(這里是 footer)指向的 commit 一樣為止硕蛹。

要合并 footer 分支醇疼,運(yùn)行:

$ git merge footer
進(jìn)行普通合并

現(xiàn)在我們將進(jìn)行更常見的合并,其中兩個(gè)分支完全不一樣法焰。你會(huì)驚訝地發(fā)現(xiàn)秧荆,實(shí)際合并 sidebar 這樣的獨(dú)特分支,操作是完全一樣的埃仪!

要合并 sidebar 分支乙濒,確保你位于 master 分支上,并運(yùn)行:

$ git merge sidebar

因?yàn)楹喜⒌氖莾蓚€(gè)完全不一樣的分支卵蛉,因此將提交 commit颁股。在進(jìn)行 commit 時(shí)么库,需要提供 commit 消息。因?yàn)檫@是合并 commit甘有,因此已經(jīng)提供了默認(rèn)消息廊散。你也可以更改消息,但通常都會(huì)直接使用默認(rèn)的合并 commit 消息梧疲。因此當(dāng)你的代碼編輯器打開并包含該消息時(shí)允睹,直接關(guān)閉編輯器以確認(rèn)使用該 commit 消息。


合并沖突

合并沖突指示符解釋
編輯器具有以下合并沖突指示符:

  • <<<<<<< HEAD 此行下方的所有內(nèi)容(直到下個(gè)指示符)顯示了當(dāng)前分支上的行
  • ||||||| merged common ancestors 此行下方的所有內(nèi)容(直到下個(gè)指示符)顯示了原始行的內(nèi)容
  • ======= 表示原始行內(nèi)容的結(jié)束位置幌氮,之后的所有行(直到下個(gè)指示符)是被合并的當(dāng)前分支上的行的內(nèi)容
  • >>>>>>> heading-update 是要被合并的分支(此例中是 heading-update 分支)上的行結(jié)束指示符

解決合并沖突
git 使用合并沖突指示符來告訴你兩個(gè)不同分支上的哪些行導(dǎo)致了合并沖突缭受,以及原始行是什么。要解決合并沖突该互,你需要:

  1. 選擇保留哪些行
  2. 刪掉所有帶指示符的行
更改最后一個(gè)commit

借助 --amend 選項(xiàng)米者,你可以更改最近的 commit。

$ git commit --amend
還原commit

當(dāng)你告訴 git 還原(revert) 具體的 commit 時(shí)宇智,git 會(huì)執(zhí)行和 commit 中的更改完全相反的更改蔓搞。我們?cè)敿?xì)講解下。假設(shè) commit A 添加了一個(gè)字符随橘,如果 git 還原 commit A喂分,那么 git 將創(chuàng)建一個(gè)新的 commit,并刪掉該字符机蔗。如果刪掉了一個(gè)字符蒲祈,那么還原該 commit 將把該內(nèi)容添加回來!
現(xiàn)在我創(chuàng)建了一個(gè)包含一些更改的 commit萝嘁,我可以使用 git revert 命令還原它

$ git revert <SHA-of-commit-to-revert>

因?yàn)樽罱?commit 的 SHA 是 db7e87a梆掸,要還原該 commit: 我需要運(yùn)行 git revert db7e87a(隨即彈出代碼編輯器,以便編輯/確認(rèn)提供的 commit 消息)

重置commit

初看牙言,重置(reset) 似乎和 還原(revert) 相似酸钦,但它們實(shí)際上差別很大。還原會(huì)創(chuàng)建一個(gè)新的 commit咱枉,并還原或撤消之前的 commit卑硫。但是重置會(huì)清除 commit!

git reset 命令用來重置(清除)commit:

可以用來:

  • 將 HEAD 和當(dāng)前分支指針移到目標(biāo) commit
  • 清除 commit
  • 將 commit 的更改移到暫存區(qū)
  • 取消暫存 commit 的更改
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末庞钢,一起剝皮案震驚了整個(gè)濱河市拔恰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌基括,老刑警劉巖颜懊,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡河爹,警方通過查閱死者的電腦和手機(jī)匠璧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咸这,“玉大人夷恍,你說我怎么就攤上這事∠蔽” “怎么了酿雪?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侄刽。 經(jīng)常有香客問我指黎,道長,這世上最難降的妖魔是什么州丹? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任醋安,我火速辦了婚禮,結(jié)果婚禮上墓毒,老公的妹妹穿的比我還像新娘吓揪。我一直安慰自己,他們只是感情好所计,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布柠辞。 她就那樣靜靜地躺著,像睡著了一般醉箕。 火紅的嫁衣襯著肌膚如雪钾腺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天讥裤,我揣著相機(jī)與錄音,去河邊找鬼姻报。 笑死己英,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吴旋。 我是一名探鬼主播损肛,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼荣瑟!你這毒婦竟也來了治拿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤笆焰,失蹤者是張志新(化名)和其女友劉穎劫谅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捏检,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年荞驴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贯城。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡熊楼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出能犯,到底是詐尸還是另有隱情鲫骗,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布踩晶,位于F島的核電站挎峦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏合瓢。R本人自食惡果不足惜坦胶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晴楔。 院中可真熱鬧顿苇,春花似錦、人聲如沸税弃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽则果。三九已至幔翰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間西壮,已是汗流浹背遗增。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留款青,地道東北人做修。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像抡草,于是被迫代替她去往敵國和親饰及。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容