使用git進行版本管理
常識
- 文件的幾個狀態:Untracked,Unmodified(已修改,此時文件在工作目錄),Modified(已暫存,此時文件在暫存區),Staged(已提交,此時文件在版本倉庫)
- 在終端使用git 命令,需要幫助可以直接在命令后面加
-h
,便可以查看命令的使用說明
文檔狀態:基本內容完成,處于細節調整中。
<a name="MljPM"></a>
一、git基礎操作
<a name="zurBZ"></a>
開始使用
<a name="EhFLr"></a>
git的基礎配置
git的基礎配置分為三個作用域
- local:只對當前的長褲有效
- global:對登錄用戶的所有倉庫有效
- system:對系統的所有用戶有效
config的優先級:local>global>system
git config --global user.name 'name'
git config --global user.email 'email@email'
# 顯示git config的配置
git config --list --local
git config --list --global
git config --list --system
git config --local user.name # 僅查看user.name
# 設置,缺省等同于local
git config --local
git config --global
git config --system
# 清除
git config --unset --local user.name
git config --unset --global user.name
git config --unset --system user.name
# git編輯器默認使用shell環境變量$EDITOR所指定的軟件。一般vim/emacs,可以使用下面命令將終端下的默認編輯器更改為vim,
git config --global core.editor vim
<a name="67Zk9"></a>
初始化git倉庫
# 已有項目代碼,進入到項目的根目錄,在當前目錄下創建git倉庫
git init
# 無項目代碼
cd 某個文件夾
git init project # 在當前目錄下創建和項目名稱同名的文件夾
cd project
<a name="2daxB"></a>
忽略某些文件
在項目內,有些文件,比如常見的第三方依賴,或者是構建后生成的文件,他們可以通過安裝或者構建得到,對于這些文件,我們通常不將其列入我們的版本倉庫,這可以通過在項目的根目錄下添加.gitignore
文件來實現。文件內容如下。
doc 將不會管理doc文件夾內的所有內容,也不管doc文件
doc/ 只不管doc文件夾內的文件
# 對于前端項目通常會添加如下的內容
.DS_Store
node_modules/
/dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
/test/unit/coverage/
/test/e2e/reports/
selenium-debug.log
我們在使用某些IDE時通常會有插件可以幫助我們更加快捷的添加gitignore。比如Jetbrains就可以通過插件很方便的添加gitignore
<a name="llpMN"></a>
git別名
git 為了方便我們的使用,可以對常用的命令起別名,從而提升終端的使用效率
git config --global alias.co checkout
git config --global alias.unstage 'reset HEAD --'
git config --global alias.visual '!gitk'
執行外部命令 + !
<a name="TEqOr"></a>
Git的工作流程
- 在目錄中添加、修改文件
- 將需要進行版本管理的文件放入暫存區域
- 將暫存區域的文件提交到Git倉庫
<a name="2AW2s"></a>
<a name="feqvU"></a>
將文件添加到暫存區
git add . # 跟蹤當前目錄下的所有文件
git add fileA fileB #跟蹤fileA和fileB文件
git add -u # 將所有已跟蹤文件的變更添加到暫存區
<a name="S73WU"></a>
將暫存區內容提交至git倉庫
提交得commit message要盡可能得有意義,便于我們了解此次變更做了什么。否則這會其他人造成困擾,也會給我們得某些操作造成困擾,比如無法通過git reflog,知道我們得每個git操作具體做了什么
git commit
git commit -m 'message'
git commit -a -m 'message' 或 git commit -am 'message' 對于在工作區內新增加還未追蹤的文件不生效。
git commit --amend //追加提交,在不增加新的commit-id的情況下,將新修改的代碼追加到前一次commit-id中
git commit --help
<a name="oE4FV"></a>
打標簽
git 打標簽,針對的是一個commit。打標簽一般是伴隨著發版進行的,通過git標簽,我們可以更加方便的進行版本查看和回退等操作,也是非常重要的一個環節。
git tag //列出已有標簽
git tag -l 'v1.8.5' //使用特定模板進行查找
標簽分為兩類:輕量標簽和附注標簽
git tag -a v1.4 -m 'message'
git show v1.2 可以看到標簽信息與對應的提交信息
git show [hash]
git tag v1.4 //輕量標簽
git tag -a v1.2 9fceb02 //針對于某個commit打標簽
****************** 共享, ********************
git push不會將tag推送到遠程倉庫
git push origin v1.5 // 標簽必須顯示推送
git psuh origin --tags // 推送所有
******************* 檢出 ********************
git checkout [tag] // 檢出某個tag
// 會處于分離頭指針狀態,,此時的提交不屬于任何的分支,如需要修改需要新建分支
git checkout -b version2 v2.0.0 // 在特定標簽上創建一個新分支
****************** 刪除tag **********************
git tag -d v1.4
git push origin :refs/tags/v.14
<a name="7vMKv"></a>
分支
分支對于git來說是非常重要的一個概念,我們通常會在主分支上新建新的分支進行自己的開發或者是bug修改。然后等待開發完成并驗證后,在通過合并分支,將我們的新功能或者是bug修改合并到主版本庫
git branch branchName
git branch -v #看本地的分支
git log --oneline --decorate //查看各個分支所指的對象。
git checkout branchName
git checkout -b branchName
git log --oneline --decorate --graph --all //輸出提交歷史,各個分支的指向及項目分支匹配情況。
git分支實質上是包含所指對象校驗和(長度為40的SHA-1值字符串)的文件。
git branch -d branchName
git branch -D branchName
git merge branchName
分支合并的結果做新的快照,自動創建一個提交指向這個新的快照。分支合并自動選取一個提交作為共同祖先,以此作為合并的基礎
分支沖突:
1.遇到沖突,Git會暫停下來,合并時可以使用git status 查看因為沖突未合并的文件,使用git merge --abort強制合并,使用git add fileName標記已解決的沖突。
git branch --merged 或 git branch --no-merged 查看已經合并或者尚未合并的分支。
沒有合并過的分支使用git branch -d branchName 刪除會失敗。
//修改分支名字,遠程的要刪除重新推
git branch -m oldName newName
<a name="jtXI6"></a>
分支開發工作流
<a name="lBQ1l"></a>
遠程分支
遠程引用是對遠程倉庫的引用(指針),包含分支標簽等等。git ls-remote
顯示地獲取遠程引用的完整列表,通過git remote show(remote) 獲得遠程分支的更多信息
git branch --set-upstream branch-name origin/branch-name
將本地分支與遠程分支關聯
<a name="7VDOn"></a>
<a name="duyEN"></a>
查看版本倉庫
<a name="JoKHo"></a>
查看當前狀態
查看當前git倉庫的狀態,比如說查看我們對工作區和貯存區做了什么更改,或者是我們當前處于哪一個分支都可以使用此命令。
git status
git status --short 或 git status -s //獲得緊湊的格式輸出
// ?? 新添加未跟蹤的文件。
//A 新添加到暫存區的文件
//M右邊,修改了沒有放到暫存
//M左邊,文件被修改了并放入暫存區。
<a name="bNuET"></a>
比較版本間差異
通過git的git diff命令,我們可以比較任意文件在兩個commit之間的差異。
比較暫存區域和工作目錄:git diff j f b d u 鍵控制翻頁 g G第一行,最后一行 3g 跳到第三行 /或者?+關鍵詞 上到下,下到上搜索,高亮的是匹配的 n下一個 N 上一個 輸入h幫助文檔 q退出
git diff # 工作區和暫存區。
git diff --cached / git diff staged # 暫存區和版本庫
git diff -- 文件名 # 具體的文件差別 可以多個文件
git diff masterA materB # 比較任意兩個分支
git diff [old-commit] [new-commit-id] -- fileName # git比較任意兩個commit之間的差異
<a name="XOv3r"></a>
查看提交記錄 git log
我們可以使用git log命令來查看我們對版本倉庫的歷史操作信息。
git log # 按照時間列出所有更新,最新的在上面,列出SHA-1校驗和名字郵箱,提交時間,說明,只展示當前分支
git log -p -2 # 用來顯示每次提交的內容差異,2表示僅顯示最近兩次提交。
git log -n2 # 僅顯示最近兩次提交。
git log --stat # 附帶總結信息,列出每次被修改的文件
git log --pretty=oneline # 在同一行顯示
git log --oneline # 同一行顯示
git log --all # 展示所有分支的版本歷史
git log --graph # 圖形化的方式展示
git log branchName # 之查看某個分支,有all的話這個不生效
git log --pretty=format:"%h - %an, %ar : %s"
git log --since=2.weeks //最近兩周
--author指定作者 --grep搜索提交說明中的關鍵字 如果要的到同時滿足這兩個選項的搜索條件的提交,就要用--all-match
-s 列出添加或移除了某些字符串的提交。例如
git log -Sfunction_name
--path指定路徑
git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \
--before="2008-11-01" --no-merges -- t/
git log --oneline --decorate 查看各個分支當前所指向的對象
git log --pretty=oneline [fileName]
git log --abbrev-commit '顯示最簡短的唯一值'
git help --web log # 通過瀏覽器查看所有
gitk # 打開圖形化界面
<a name="ANAxu"></a>
文件操作
<a name="2XWcZ"></a>
對文件重命名
將readme重命名為readme.md
# 方法1
mv readme readme.md # 直接重命名
git add readme.md # 添加重命名后的文件
git rm readme # 刪除原來文件
# 方法2 git命令
git mv readme readme.md #使用git mv變更文件名
<a name="wuwRS"></a>
<a name="uUDYh"></a>
重命名文件
git mv file_from file_to
等同于
mv file_from file_to
git rm file_from
git add file_to
<a name="XLRBw"></a>
刪除文件
git rm 文件名。刪除文件并提交,使文件不再被追蹤。
git rm 文件名 等同于 rm 文件名+git add .
如果刪除之前修改過并放入暫存區。需要-f強行刪除
git rm --cached 文件名從暫存區刪除,但保留在工作區
<a name="dE9Tl"></a>
貯藏代碼
當我們對工作區和貯存區的代碼進行了更改之后,有額外的任務插入,我們需要將現在工作區和貯存區的內容暫時的存儲起來,此時便用到了 git stash
<a name="BoxJJ"></a>
git stash
git stash
git stash list
git stash apply // 已暫存的文件不會被重新暫存
git stash apply --index // 重新暫存已暫存的文件
git stash apply stash@{2}
git stash drop stash@{2} //刪除儲藏
git stash pop // 重新應用并刪除
git stash branch branchName //從最新儲藏新建分支,成功后會刪掉該儲藏
git stash save noteContent // 等同于git stash,但是可以增加注釋
git stash clear //清理所有
git stash show stash@{2} //查看stash和當前的差異
<a name="3fa4e3ad"></a>
回退與撤銷
<a name="Glw6W"></a>
撤銷操作
git commit --amend //第二次提交代替第一次提交的結果
git reset HEAD <file>... // 取消暫存。(不加選項只會修改暫存區內容,所以并不危險)
git checkout -- <file>
<a name="Zgtx7"></a>
暫存區恢復到頭指針的狀態
不保留暫存區的所有內容,將其恢復到跟head一樣。
- 首先要將工作區內容 git stash
- git reset HEAD 將暫存區的恢復到了工作區
<a name="4ilOn"></a>
將暫存區的恢復到工作區
取消工作區的變更<br />git checkout -- fileName
<a name="jvy9s"></a>
刪除歷史提交中近幾個commit
git reset --hard hash
<a name="sGHxV"></a>
代碼回退
- 將暫存區域恢復到之前狀態:git reset HEAD 文件名,不指定為所有
- 將暫存區的舊版本呢覆蓋回:
git checkout -- 文件名
- 回到過去:
- 倉庫Repository和暫存區Stage之間,commit reset
- 工作空間Working和暫存區Stage之間,add checkout
- git reset HEAD~ ~指上一個
- git rest --mixed(默認的不用寫) HEAD~
- 移動HEAD指向,將其指向上一個快照
- 將HEAD移動后指向的快照回滾到暫存區
- git rest --soft HEAD~
- 移動HEAD指向,將其指向上一個快照(撤銷一次錯誤的提交)
- git rest --hard HEAD~ (存在危險性)
- 移動HEAD指向,將其指向上一個快照
- 將HEAD移動后指向的快照回滾到暫存區
- 將暫存區的文件還原到工作目錄
- 移動HEAD的指向(--soft)
- 將快照混滾到暫存區域([--mixed], 默認)
- 將暫存區域還原到工作目錄(--hard)
- 回滾指定快照,指定前幾個:git reset id號
- 回滾快照里個別文件
git reset 快照版本 文件名/路徑
git reset 快照版本的ID號
<a name="44a6ae3f"></a>
遠程倉庫
git remote // 列出遠程倉庫簡寫
git remote -v //展示簡寫和對應的URL
git remote add <shortname> <url>
git fetch [remote-name] //從遠程倉庫獲取數據,執行完成,會擁有遠程倉庫中所有分支的引用,可以隨時合并查看。只是將數據拉取到本地倉庫,不會合并或者修改。
git pull 會自動甚至本地的master跟蹤克隆的遠程倉庫的master
git push origin master //寫入權限,之前別人沒有推送過。
git remote show origin 查看某個遠程倉庫的信息
git remote rename oldname newname //修改遠程倉庫名字,也會修改你的遠程分支的名字
git remote rm 倉庫名
git clone -b [branchName] [branchName]
<a name="Ews5p"></a>
多人協作
多人協作,不能強制提交,不能變基。
<a name="uNUd8"></a>
多人修改同一個文件的文件名
會報沖突,手動解決<br />git rm 源文件名<br />git add 需要的文件名<br />git rm 分期的文件名
<a name="tZdqC"></a>
有人把文件名變更,其他人基于原來的文件名變更了文件內容。
git會自動合并。git可以很好的處理這種情況,其他的版本控制不一定能良好處理。
<a name="WdO9g"></a>
高級使用
<a name="HaVOb"></a>
git chery-pick
git chery-pick可以將某個commit復制到當前的分支。chery-pick后,處于對記錄歷史的考慮,Auther是這個commit原來的提交人,但commiter是自己。
舉例子:將branch1 的 commit1 提交 應用到 branch2 分支上來
實現步驟:
- 使用git log 查看需要被應用到新分支的commit的 hash是多少。
- 切換到branch2
git chery-pick [commit1hash]
即可自動提交
chery-pick的參數:
- 在git chery-pick后加上
-n
可以避免自動提交。 - 在git chery-pick后加上
-e
可以編輯commit信息。 - 與git rebase類似,當遇到沖突時有以下處理辦法,
git cherry-pick --continue
,git cherry-pick --abort
,git cherry-pick --quit
。
<a name="yaelu"></a>
將commit之間得差異差異應用到新的提交
場景:branchA和branchB的差異應用到branchC<br />實現步驟:
- 在
git diff
后增加> patch
- 切換到branchC
git apply patch
- 注意會在當前目錄下生成patch文件,需要手動刪除等操作
<a name="UMeBQ"></a>
git鉤子
通過git鉤子,可以使得我們在執行git得某些操作時,觸發一些腳本,比如在提交時校驗我們的commit message是否符合要求,才我們推送代碼到遠程前,運行我們代碼中的單元測試確保代碼質量等。
<a name="7fyKz"></a>
git忽略commit鉤子
-
git commit --no-verify
,這可以使我們得提交不觸發commit得執行。
<a name="z9FRo"></a>
使用git鉤子校驗commit message
<a name="hI1qP"></a>
git reflog
git reflog 主要記錄我們對于git得操作,通過它可以查找到所有分支的所有操作記錄,包括刪除的以及reset的內容!當我們因為不恰當得git操作,不小心將我們得代碼刪除了,我們就可以通過git reflog找回我們得代碼。git log存儲在本地。
<a name="ERvGO"></a>
不小心git reset --hard HEAD^找回
不小心將我們得代碼回退到了上個版本,找回丟失得代碼。
實現步驟:
- 使用git reflog找到我們不小心刪除得commit得commit hash。
- 使用chery-pick 找回即可
<a name="ElcKL"></a>
在分離頭指針狀態下進行了提交切換分支之后丟失代碼得找回
實現步驟與 不小心git reset --hard HEAD^找回 方法相同
<a name="rfo4w"></a>
更改git提交歷史
通過git rebase,我們可以很容易的對我們的提交歷史做更改。對提交的歷史進行修改,可能會造成代碼的沖突,我們需要解決沖突。
更改git的提交歷史是非常****危險****的操作,更改后的分支無法直接推送到遠程倉庫,****必須強制推送****,如果分支涉及到****多人協作,****需要特別注意,避免產生不必要的麻煩****。
<a name="YnqTY"></a>
通過變基來整合不同分支的修改
我們已master分支為基準開發新的功能,首先我們為了開發新的功能切出了新的分支feature1,經過一周時間,我們開發完畢。在這一周之內,其他同事也在進行正常的開發并且上線完成,合入到了master分支。此時我們需要將這一周之內其他同事對于master的更改應用到自己的feature1分支上,此時便可以通過合并分支和變基來實現,通過變基可以使我們的git提交歷史趨與一條直線。他與合并分支的明顯區別就是,合并分支,會使得我們的多次commit與這周內master變更的commit依照時間混合在一起,使用變基則會使得我們得commit順序位于master上得這些提交之后。變基操作可能會產生沖突。
# 使用合并分支
git merge master
# 使用變基
git rebase master
<a name="80kqP"></a>
修改commit的順序
git rebase -i [commit-hash]
- 此時會出現一個編輯窗口,我們直接在編輯窗口內移動coomit的順序之后保存即可。
常用的vim快捷鍵:復制:yy, 粘貼p,回退 u ,保存wq
<a name="GsqR4"></a>
借助于git rebase,拆分commit
https://blog.csdn.net/weixin_33736832/article/details/87960663
實現步驟:
- git rebase -i [commit-hash]
- 此時會出現一個編輯器窗口,在編輯器內出現的是我們所有的commit,將要拆分的commit 前面狀態改為e,保存編輯的內容。
- git rebse會停留在需要拆分的commit。
- 此時使用 git reset HEAD^ 撤銷需要拆分的commit。
- 查看當前的status,此時可以按照我們的需要,添加多次提交。
- 我們更改玩提交后,git rebase --continue。此時我們已經成功修改了提交記錄
<a name="l8Z2a"></a>
二、Git工具
<a name="00cIU"></a>
選擇修訂版本
<a name="iDKjz"></a>
分支引用
git show [branchName]
<br />
git show SHA-1
git rev-parse [branchName]
查看git當前處于什么狀態。
<a name="IqnJZ"></a>
引用日志
git reflog
查看引用日志,每當HEAD所指向的位置發生了變化,git就會將這個信息存儲到引用日志。
git show HEAD@{5}
git show master@{yesterday}
查看昨天這個分支指向了哪次提交。只對還在引用日志里的數據有用。
git log -g
查看類似于 git log 輸出格式的引用日志信息
分支引用只存在于本地倉庫,新克隆則引用日志是空的
<a name="N3X4n"></a>
祖先引用
使用HEAD^來查看上一次提交<br />
HEAD^2 D當前提交的第二次父
HEAD~ 指向第一次父提交<br />
HEAD~2 第一父提交的第一父提交
這兩種可以組合
<a name="0u7UT"></a>
提交區間
git log master..experiment 查看在experiment分支中存在而不在master分支中存在的提交。
git log origin/master..HEAD 查看即將推送到遠端的內容。
留空一邊git默認其為HEAD
<a name="N5tS2"></a>
多點
git log refA..refB
git log ^refA refB
git log refB --not refA
與雙點語法區別。
git log refA refB ^refC
git log refA refB --not refC
<a name="Tnphp"></a>
三點
選出兩個引用中只有一個包含的提交<br />
git log master...experiment
<br />
增加參數 git log --left-right master...experiment
<a name="e889f8bb"></a>
交互式暫存
交互式暫存,將文件的特定部分組合成提交,修改一組文件后,希望改動可以放到若干個提交而不要混雜在一起。這可以確保提交是邏輯上獨立的變更集<br />
git add -i
<br />
git add --interactive
在命令區域,可以暫存文件,取消暫存文件,暫存文件的一部分,添加未被追蹤的文件,查看暫存區內容區別。
<a name="MJa3W"></a>
暫存與取消暫存文件
<a name="ba590b6b"></a>
<a name="Nntl6"></a>
三、git基礎知識
<a name="fvGob"></a>
.git里面都有什么
- HEAD文件存儲當前的分支,直接編輯與切換分支是同樣的效果
- config文件存儲,針對于本文件的config
- refs文件夾 heads對應分支 tags head內的文件存儲的是hash值, tags內的hash,hash值指的是 commit
- objects 內的文件夾與文件夾內的文件組成hash值,使用git cat-file 查看是tree。 使用命令查看數的內容,是一個文件對象,通過git cat-file -p hsdh查看就是文件的內容
git cat-file -t hash #命令顯示版本庫對象的內容、類型及大小信息。 看內容用-p
commit tree blob是三個核心的對象。
只要任何文件的文件內容相同,就是唯一的blob
<a name="Mr8Rz"></a>
commit tree blob 三者關系
[圖片上傳失敗...(image-acb2c9-1583609442636)]<br />一個commit對應一顆樹,樹代表了commit對應的視圖,視圖里面存儲快照,快照里放了當前commit對應的本項目倉庫的所有文件夾以及文件的快照。blob與文件名無關系。
舉例:<br />空倉庫,下有doc/readme
git add 將文件加入暫存區,那么git就會在.git/objects下創建對應文件的blob。比如 .git/objects/2d/832d90044c。使用git cat-file -t 2d832d90044c 查看可以發現類型是blob,通過git cat-file - p t2d832d90044c,可以查看到,文件的具體內容
git commit 提交后,那么git就會在.git/objects下會有4個文件.
- 一個對象:tree 內容是doc
- 一個對象:blob readme的文件內容
- 一個對象:tree 里面readme文件的blob
- 一個對象: commit

<a name="QZGt3"></a>
分離頭指針(detached HEAD)
變更沒有基于某個branch去做,所以進行分支切換時,在分離頭指針之上產生的commit,可能會被git當作垃圾清理掉,如果認為變更時重要的那么,一定要將變更與分支綁到一起。<br />git checkout [commitHash]<br />本質上是工作在沒有分支的狀態下,此時可以做開發,提交(通過git log可以明顯的看到HEAD沒有與分支關聯)。如果切換到新的分支,那些沒有與分支關聯的變更可能會被git當作垃圾清理掉。要對分支做變更。git checkout -b new-branch-name。
在分離頭指針時切換分支git會提示是否要為已經提交的commit建branch, git branch <new-branch-name> <commitHash>
可以利用這一特性做嘗試,當丟棄時,直接切換到別的分支即可。
<a name="9ip7C"></a>
特殊標識符HEAD
HEAD不僅可以指代新分支最后一次提交,同時HEAD還可以不跟分支掛鉤,處于分離頭指針狀態(指導某個commit上),如果新建/切換branch,HEAD指針指向新的分支。無論處于什么狀態,HEAD最終會落腳在commit。
HEAD可以指代commit。<br />git diff HEAD HEAD^ 比較這個commit和其父commit的提交。
HEAD^^ 等同于 HEAD~2
<a name="hUEe6"></a>
git的備份
可以備份到本地的其他地方。<br />協議和智能協議<br />直觀區別:啞協議傳輸進度不不可?見;智能協議傳輸可?見。<br />傳輸速度:智能協議?比啞協議傳輸速度快。
git clone --bare /User//.git ya.git 啞協議 <br />git clone --bare file:///User//.git zhineng.git 智能協議
<a name="7EArh"></a>
git remote add zhineg file:///User/**/.git<br />git push 進行遠端備份
<a name="YtZfa"></a>
<a name="tQku9"></a>
<a name="lkj6S"></a>
四、使用問題歸納
<a name="0Cv7z"></a>
本地初始化git倉庫并添加遠程倉庫
git init
git remote add origin <遠程倉庫地址>
git add .
git commit -m "注釋"
git pull --rebase origin master
git push origin master
<a name="VTDTW"></a>
<a name="pBtBm"></a>
刪除遠程分支后本地還可以通過 git branch -a看到
解決<br />https://www.cnblogs.com/taohuaya/p/10912245.html
git branch -a #查看所有本地分支和遠程分支
git remote show origin #查看remote地址,遠程分支,還有本地分支與之相對應的關系等
git remote prune origin [branch] # 根據提示進行此操作,刪除本地分支的branch,這樣就可以在本地刪除遠程不存在的分支
<a name="SrcWP"></a>
git忽略已經提交的文件(.gitignore文件無效)
解決鏈接:http://www.lxweimin.com/p/e5b13480479b
方案一
git rm [ignoreFileName]
git commit -am [commit-message] #刪除不需要的文件
在.gitignore
文件中添加忽略規則,提交.gitignore
文件
git push [remote]
方案二
git rm -r --cachced build/* # 都不需要可以不跟文件名
git add .
git commit -m 'commit '
git push
針對已經commit過且有改動的文件 (因為rm的是cached列表中的文件, cached列表即修改列表)
最好在創建 git倉庫的同時就創建.gitignore
文件
<a name="nBAyQ"></a>
merge兩個不相干的分支
git merge -allow-unrelated-histories master orogin/master
<a name="qvuQH"></a>
五、Git可視化軟件推薦
<a name="Y9axO"></a>