版本控制
版本控制就是控制版本,版本控制系統(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
- 用來更改目錄 -
rm
z- 用來刪除文件和目錄
使用 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
On branch master
– 這部分告訴我們 Git 位于 master 分支上。你已在術(shù)語表中獲取了對(duì)分支的介紹退唠,那么這是"master"分支(也就是默認(rèn)分支)眠饮。我們將在第 5 節(jié)課深入了解分支。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)目,因此這一行可以忽略松蒜。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 命令
-
git log -p fdf5493
通過提供 SHA油宜,git log -p 命令將從這條 commit 開始掂碱!無需滾動(dòng)并逐條查閱!注意慎冤,它還會(huì)顯示在所提供的 SHA 之前提交的所有 commit 信息疼燥。 -
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 add
將index.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)致了合并沖突缭受,以及原始行是什么。要解決合并沖突该互,你需要:
- 選擇保留哪些行
- 刪掉所有帶指示符的行
更改最后一個(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 的更改