玩轉git

一.Git簡介

  • 1.1 Git的特色
  1. 最優的存儲能力
  2. 非凡的性能
  3. 開源
  4. 很容易作備份
  5. 支持離線操做
  6. 很容易定製工做流程
  • 1.2 web端提供git服務的產品
  1. git
  2. GitHub (全球最大的開源社區)
  3. GitLab (本身提供了CI機制,通常公司內部使用)

二.安裝Git

在Git官網上有詳細的安裝方式 起步 - 安裝 Gitcss

三.Git 配置

// 全局配置 --global
git config --global user.name 'your_name'
git config --global user.eamil 'your_eamil@domin.com'
複製代碼

config的三個做用域(local、global、systemhtml

git config --local  (local只針對某個倉庫有效)
git config --global (global對當前用戶的全部倉庫有效)
git config --system (system對系統全部登陸的用戶有效,基本不用)
複製代碼

顯示config的配置,加--listnode

git config --list --local
git config --list --global
git config --list --system
複製代碼

清除設置git

git config --unset --local user.name
git config --unset --global user.name
git config --unset --system user.name
複製代碼

4、建Git倉庫

兩種場景github

  1. 把已有的項目代碼歸入Git管理
cd 進入項目所在的文件夾
git init
複製代碼
  1. 新建的項目直接用Git管理
cd 進入某個文件夾
git init your_project #會在當前路徑下建立和項目名同名的文件夾
cd your_project
複製代碼
  1. 配置git config
git config --local user.name 'your_name'
git config --local user.eamil 'your_eamil@domin.com'
複製代碼
  1. 建立readme
touch的做用是更改一個文件或目錄的時間。touch readme.MD 若是readme.MD不存在,則建立空文件readme.MD
touch readme.MD 
複製代碼
  1. 提交
git add readme.MD
git status 查看文件狀態
git commit -m 'Add readme'
git log 查看日誌
複製代碼

若未add,直接commit或git status則會報以下錯誤(untracked files) web

config的設置中,local的設置的優先級要高於global算法

添加文件後直接commit會報錯,緣由是什麼?shell

五.認識工做區和暫存區

工做目錄 ---> 暫存區 ---> 版本歷史npm

1. git add files 將文件添加到暫存區
2. git commit 
複製代碼

cp命令來拷貝文件json

clear清理屏幕

git add -u (u表明update,表明將已經被git管理的文件一塊兒提交到暫存區)
複製代碼

六.給文件重命名的簡便方法git mv

readme文件重命名爲readme.md

mv readme readme.md
git status
複製代碼

發現git提示,你 deleted: readme,並新建了 read.md

以上問題的解決方法

git add readme.md 添加
git rm readme 刪除
git status
複製代碼

上述操做後提示,修改爲功

renamed: readme -> readme.md
複製代碼
git reset --hard 將剛纔的修改撤回
複製代碼

以上操做能夠用一個更簡單的命令解決

git mv readme readme.md
複製代碼

這樣就用git mv一個步驟解決了變動文件名

七.經過git log查看版本演變歷史

git log 查看提交的完整信息
git log --oneline 只查看commit內容
git log -n4 查看最近4個
git log -n4 --oneline 組合使用
複製代碼
git branch -v 查看本地有多少分支
git checkout -b testing 4323c83dcdf 基於以前的某個分支建立testing分支
複製代碼
git commit -am "add testing file"  將工做區的內容直接建立到版本歷史庫中
git branch -av 查看有多少分支
複製代碼
git log 查看當前分支的歷史
git log --all 查看全部分支的歷史
git log --all --graph 經過圖像化的方式查看log
git log --oneline
git log --oneline --all
git log --oneline --all -n4
git log --oneline --all -n4 --graph
git log --oneline --all testing 指定的testing分支不起做用
複製代碼
git help --web log 經過web查看git的全部命令
複製代碼

八.用圖形界面工具來查看版本歷史

在命令行輸入以下命令:

gitk
複製代碼

不過這個圖形界面的清晰度有待提升

cheery-pick就是挑選某一次的commit提交放到另外一個分支

尊重版權,顯示 AuthorCommitter

九.瞭解.git目錄

進入.git文件

cd .git
ls -al
複製代碼

  • 1.查看HEAD文件
cat HEAD
顯示
ref: refs/heads/RELEASE // 顯示當前所在分支RELEASE
git checkout testing    // 切換分支
cat HEAD                // 再次查看HEAD文件
ref: refs/heads/testing // 顯示當前所在分支爲testing
複製代碼
  • 2.查看config文件
cat .git/config
複製代碼

顯示當前項目的基礎配置信息

  • 3.查看refs文件夾(引用:存放tag和tag的信息)
cd refs
ls -al
顯示目錄文件夾
heads // 分支 drwxr-xr-x d表明文件夾
tags  // 標籤(里程碑標識)

cd heads/
顯示文件夾
RELEASE
testing

cat RELEASE
acedf122defesci*******
git cat-file -t acedf122defesci*******  // 查看類型 表明RELEASE的指針指向哪個commit
commit // 顯示爲commit類型

git branch -av  // 查看分支進行驗證

// 驗證testing分支
cat testing
acedf122defesci******* // 哈希值若是足以標誌惟一性則顯示的較短,不然則顯示的較長
複製代碼
  • 4.查看objects,是git文件系統的核心內容(只要任何文件的文件相同,就是惟一的blob,這樣設計的好處是什麼呢?)
cd objects/
ls -al 查看詳情
cd 任意文件夾
ls -al
tree 是一棵樹
看樹的內容用
git cat-file -p acedf122defesci*******  // 查看類型
git cat-file -p fresfer3432cxrff******* // 查看到多是css文件
複製代碼

十. committreebolb三個對象之間的關係

存儲是git的核心技術點,git提供優良的存儲能力,對版本控制系統是很是關鍵的。由於版本控制系統就是管理文檔,但文檔的變動是很頻繁的,若是沒有一套好的存儲機制的話,庫就會愈來愈大,性能就會愈來愈差。所以設計一個良好的存儲機制,對版本控制系統來講很是關鍵!

  • Git對象彼此關係

(* 注:圖片來自網絡)

三者之間的關係

commit

一個commit對應一棵樹tree(文件夾),表明取出某個commit,快照,經過樹呈現出來。

tree

包含index.html readme styles,每一個文件都是一個blob,blob和文件名沒有任何關係,只要內容相同,就是惟一的blob,能夠大大的節約存儲空間。

blob

對不一樣的文件用cat命令能夠進行查看

小結:

  • 1.commit中必定有一棵樹
  • 2.這顆樹tree裏必定包含那個時間點到底包含了什麼文件夾,什麼文件
  • 3.這個樹小有包含了各個小的樹,層層展開,最後的頁面節點就到了blob

十一.數一數項目中tree的個數

新建的git倉庫,有且僅有一個commit,僅僅包含/doc/readme,請問內含多少個tree,多少個blob?

git init
ls-al
mkdir doc
git status // 沒有變化
echo "hello,world!" > readme 建立readme並寫入hello,world!
cd ../
git status
find .git/objects -type f // 空的
git add doc
git status
find .git/objects -type f // 有值,建立了blob
git commit -m "add readme"
find .git/objects -type f // 變成了4個object
git cat-file -t 083e18d   // tree
git cat-file -p 083e18d   // doc
git cat-file -t 2d832d90
git cat-file -p 2d832d90  // hello,world!
複製代碼
  • 1.首先,使用git log查看提交記錄。
  • 2.能夠看到其中的一次提交,爲"5e15bae4036c9",查看commit "5e15bae4036c9" 執行命令git cat-file -p 5e15bae4036c9

執行結果代表:該提交中包含 tree

  • 3.再次執行git cat-file -p 18baf1927939c1d88ab

執行結果代表:該提交中包含 README.md 、package.jsonblob類型的文件和 publictree類型的文件夾

從上面的例子,咱們就可總結出git中committreeblob之間的關係。

十二.分離頭針狀況下的注意事項

git branch -av
git log
git checkout c4ccf8ffceb142 // 輸出了以下信息
複製代碼

提示 You are in 'detached HEad' state.

正處於分離頭指針狀態。本質就是正工做在一個沒有分支的狀態下。 在如今的狀態下有了commit,又切到了其餘分支工做,這樣在分離頭指針狀態下寫的內容,極可能被git當作垃圾清理掉。因此,你想作修改變動,必定要與某個分支掛鉤。

  • 在什麼狀態下能夠用好分離頭指針呢? 假如你想嘗試某個功能,發現效果很差,可隨時丟棄。
git commit -am"Change style" // add + commit
git checkout RELEASE // 切換以後有以下提示
複製代碼

gitk --all

git branch fix_css c4ccf8ffceb142 // 根據指示信息新建分支,進行保留

git log  進行查看
複製代碼
  • 分離頭指針的做用:
    1. 作臨時性修改的時候進行嘗試
    1. 修改後的內容若是要保留,可根據提示進行操做

十三.進一步理解HEADbranch

HEAD不只能夠指向某個分支,還能指向某個commit

git checkout -b fix_readme fix_css // 基於fix_css分支建立一個新的分支fix_readme,並切到新分支fix_readme

git log -n1 // (HEAD指向了新的分支)
gitk --all
cat .get/HEAD // ref: refs/heads/fix_readme

git diff 3ede435ded 490ikl9jjih  // 查看兩個commit的diff
// HEAD也能夠用來快速的指代
git diff HEAD HEAD~1  // 當前和父親的比較
git diff HEAD HEAD^   // 當前和父親的比較
git diff HEAD HEAD^^   // 當前和父親的父親的比較 等同於git diff HEAD HEAD~2
複製代碼

十四.怎麼刪除不須要的分支

gitk -all
git branch -d fix_readme // 刪除fix_readme分支
git branch -D fix_readme // 強制刪除fix_readme分支
git branch -av // 查看剩餘的分支
複製代碼

不能在當前分支刪除當前分支

十五.怎麼修改最新commitmessage

git log -1 // 查看最近一次commit
git commit --amend // 便可修改這次commit信息
複製代碼

十六.怎麼修改老舊commitmessage

變基 rebase

Rebase主要有兩種場景:1.合併屢次提交記錄 2.合併分支

Git中整合來自不一樣分支的修改主要有兩種方法:mergerebase

merge合併的結果是把兩個分支的最新快照以及二者最近的公共祖先進行三方合併,合併的結果是生成一個新的快照(並提交)。rebase則是另外一種方法,這種操做就叫作變基。你可使用rebase命令將提交到某一分支上的全部修改都移至另外一分支上,就好像「從新播放」同樣。它的原理是首先找到這兩個分支(即當前分支 experiment、變基操做的目標基底分支 master)的最近共同祖先 C2,而後對比當前分支相對於該祖先的歷次提交,提取相應的修改並存爲臨時文件,而後將當前分支指向目標基底 C3, 最後以此將以前另存爲臨時文件的修改依序應用。 merge和rebase,這兩種整合方法的最終結果沒有任何區別,可是變基使得提交歷史更加整潔。 你在查看一個通過變基的分支的歷史記錄時會發現,儘管實際的開發工做是並行的,但它們看上去就像是串行的同樣,提交歷史是一條直線沒有分叉。

變基操做的實質是丟棄一些現有的提交,而後相應地新建一些內容同樣但實際上不一樣的提交。 若是你已經將提交推送至某個倉庫,而其餘人也已經從該倉庫拉取提交併進行了後續工做,此時,若是你用 git rebase 命令從新整理了提交併再次推送,你的同伴所以將不得再也不次將他們手頭的工做與你的提交進行整合,若是接下來你還要拉取並整合他們修改過的提交,事情就會變得一團糟。

總的原則是,只對還沒有推送或分享給別人的本地修改執行變基操做清理歷史,從不對已推送至別處的提交執行變基操做,這樣,你才能享受到兩種方式帶來的便利。

git rebase -i 27de432fe(要修改的父級的commit哈希)  將pick改成r 對修改後的文件進行保存。自動彈出另外一個界面。此時便可修改這次commit文案
複製代碼

要修改的父級的commit哈希

r進行修改,r表明reward,只修改commit信息,出現以下信息

退出後,自動跳轉到新的界面。

修改後保存退出,提示以下信息,修改爲功

git log // 你會發現修改commit以後,hash值也發生了修改

git log -n5 --graph
複製代碼

能夠對任何一次commit進行修改

變基:基於某個基礎進行變更

  • 使用rebase合併分支步驟
  1. 從master分支切出dev分支,進行開發
git:(mater)  git checkout -b feature1
複製代碼

  1. 此時,你的同事完成了一次hotfix,併合併入了master分支,此時master已經領先於你的feature1分支了:

3. 此時,咱們想要把 master分支的改動同步到 feature分支,咱們經常使用的爲 merge,執行:

git:(feature1)  git merge master
複製代碼

合併以後的結果如上圖,執行:

git:(feature1)  git log
複製代碼

就會在記錄裏發現一些merge信息,可是咱們以爲這樣污染了commit記錄,想要保持一份乾淨的 commit,此時,git rebase就排上用場了。

  1. 先回退到同事 hotfix 後合併 master 的步驟:

  1. 使用 rebase
git:(feature1)  git rebase master
複製代碼

這裏rebase作了什麼呢?

首先,git 會把 feature1 分支裏面的每一個 commit 取消掉;
其次,把上面的操做臨時保存成 patch 文件,存在 .git/rebase 目錄下;
而後,把 feature1 分支更新到最新的 master 分支;
最後,把上面保存的 patch 文件應用到 feature1 分支上;
複製代碼

commit記錄能夠看出,feature1分支是基於hotfix合併後的masterfeature1便成爲了最領先的分支,並且沒有mergecommit記錄,看起來舒服多了。

  1. rebase的過程當中,可能會出現衝突conflict。此時,git會中止rebase並會讓你去解決衝突。在解決衝突後,用git add去更新這些內容。注意:add以後不要執行git commit,須要執行git rebase --continue
git rebase --continue
複製代碼

這樣git會繼續執行餘下的patch補丁文件了。

  1. 在任何狀況下,咱們均可以用--abort命令參數來終止rebase的行動,而且分支會回到rebase開始前的狀態。
git rebase --abort
複製代碼

附:merge到一半如何取消合併

git merge --abort
複製代碼

附:解決衝突git mergegit rebase中的ourstheirs

git mergegit rebase的區別:git rebase不會產生額外的commit。在實際項目中,不一樣的公司傾向的使用方法不同,rebase能使commit是一條線,相對較爲清晰,而merge則能完整的記錄全部的操做,相對更加完整。

解決衝突:merge的時候,用git checkout --theirs留下傳入的,用git checkout --ours留下當前的。 rebase的時候,用git checkout --ours留下傳入的,用git checkout --theirs留下當前的。 在merge時,ours 指代的是當前分支,theirs 表明須要被合併的分支。而在 rebase 過程當中,ours 指向了修改參考分支,theirs 倒是當前分支。 mergerebase對於ourstheirs的定義是徹底相反的。

十七.把連續的多個commit整理成1個

squash

合併最近的4次提交記錄:

git rebase -i HEAD~3
複製代碼

這時候,會自動進入vi編輯模式:

s cacc52da add: qrcode
s f072ef48 update: indexeddb hack
s 4e84901a feat: add indexedDB floder
s 8f33126c feat: add test2.js

# Rebase 5f2452b2..8f33126c onto 5f2452b2 (4 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
複製代碼

並提示了以下幾個命令

p, pick = use commit
r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like 「squash」, but discard this commit’s log message
x, exec = run command (the rest of the line) using shell
d, drop = remove commit
複製代碼

將你須要合併的提交的記錄前綴改成s

s cacc52da add: qrcode
s f072ef48 update: indexeddb hack
s 4e84901a feat: add indexedDB floder
p 8f33126c feat: add test2.js
複製代碼

若是保存的時候,你碰到了這個錯誤:

error: cannot 'squash' without a previous commit // 注意不要合併先前提交的東西,也就是已經提交遠程分支的紀錄。
複製代碼

若是你異常退出了 vi 窗口,沒關係張:

git rebase --edit-todo
複製代碼

這時候會一直處在這個編輯的模式裏,咱們能夠回去繼續編輯,修改完保存一下:

git rebase --continue  
複製代碼

查看結果

git log // 兩次提交合併成了一次,減小了無用的提交信息。
複製代碼
git rebase -i r435dr34oi4od // 多個變動的父commit的hash複製代碼

將連續的幾個commit合到一個commit中

十八.把間隔的幾個commit整理成一個

好比git中有兩個關於readme的修改,可是是不連續的,如何將這兩個commit合併爲同一個?

git rebase -i 43s4dreji34fc3 // 父級commit
複製代碼

將兩個要合併的commit放在一塊兒,使用s命令

git rebase --continue // 將commit合併

git status
 
gitk --all // 用樹形結構查看,出現了兩個沒有祖先的commit
複製代碼

將剛提交的commit撤回

git reset --soft HEAD^ // 撤回上一次的提交,並保留代碼
複製代碼

HEAD^的意思是上一個版本,也能夠寫成HEAD~1

若是你進行了2次commit,想都撤回,可使用HEAD~2

--mixed --soft --hard這幾個參數的區別:

  • --mixed不刪除工做空間改動代碼,撤銷commit,撤銷git add . ,這個爲默認參數,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是同樣的。
  • --soft不刪除工做空間改動代碼,撤銷commit,不撤銷git add .
  • --hard刪除工做空間改動代碼,撤銷commit,撤銷git add . ,注意完成這個操做後,就恢復到了上一次的commit狀態。

commit註釋寫錯了,能夠執行下面的代碼:

git commit --amend
複製代碼

此時會進入默認vim編輯器,修改註釋完畢後保存就OK了。

十九.怎麼比較暫存區和HEAD所含文件的差別

將暫存區的文件和當前分支最近的一次commit作比較

此時已經執行過git add,文件提示已變爲綠色,此時須要--cached命令來查看暫存區的diff

git diff --cached // 查看暫存區
複製代碼

二十.怎麼比較工做區和暫存區所含文件的差別

bare repository裸倉庫,即.git下的內容

git diff -- index.html
複製代碼

git diff默認比較工做區和暫存區的區別

二十一.如何讓暫存區恢復成和HEAD的同樣

使用情景:將文件放入到暫存區以後,在工做區又有了一次修改,感受比暫存區的要好,此時就想把暫存區的刪除掉,恢復成和HEAD的同樣。

git reset HEAD // 將全部的暫存區的文件取消掉,回到了工做區
git diff --cached // 驗證暫存區與HEAD是否一致
複製代碼

二十二.如何讓工做區的文件恢復成和暫存區同樣

git add index.html
git diff --cached // 暫存區
git status

// 根據提示
git checkout -- index.html
複製代碼

變動工做區用git checkout ,變動暫存區用git reset.

二十三.怎樣取消暫存區部分文件的更改

git reset HEAD -- index.html // 將暫存區的文件撤回到工做區
複製代碼

二十四.消除最近幾回提交

git branch -av
git log
git reset --hard 5def35df890d // 回到某次提交以前,以前的將會被刪除
複製代碼

回到你指定的commit的hash值的時候,以前的將會被刪除

二十五.查看不一樣提交的指定文件的差別

git log -n8 --all --graph              // 查看最近8次的提交,全部分支的狀況
git diff temp master                   // 查看temp和master全部的區別
git diff temp master -- index.html     // 查看temp和master中index.html的區別
git branch -av
git diff 5df3fd1 03defx53 -- index.html // 用hash的方式查看
複製代碼

此種查看方式都是查看最新的一次提交

二十六.正確刪除文件的方法

rm readme             // 工做區刪除
git rm readme         // 暫存區刪除
git reset --hard HEAD // 恢復到了和頭指針相同的狀態

複製代碼

其實只須要下面這一條命令便可:

git rm readme         // git rm + 具體文件,直接將刪除的文件放在暫存區,就不須要在工做路徑下刪除文件了
複製代碼

二十七.開發中臨時加塞了緊急任務怎麼處理

git stash             // 存放起來
git stash pop         // 釋放出最新的stash
git stash list        // 查看stash信息,是否還存在
git stash apply       // 1.把以前存放的文件釋放出來,2.stash中的信息還存在
git reset --hard HEAD // 使其與頭指針相同
複製代碼
  • popapply的區別:
    1. 執行pop以後會丟掉以前的信息
    1. 執行apply以後以前的信息還存在於堆棧之中

二十八.如何指定不須要Git管理的文件

.gitignore文件名不能修改,不然將會失效

# gitignore
HEAD
.cache
v*
alias

# For testing
test/bak
.urchin.log
.urchin_stdout
test/**/test_output

node_modules/
npm-debug.log

.DS_Store
current
/default-packages

# Only apps should have lockfiles
npm-shrinkwrap.json
package-lock.json
yarn.lock

複製代碼
ls -al
vi .gitignore
rm -rf doc // 刪除doc文件夾
複製代碼

二十九.如何將Git倉庫備份到本地

  • http/https須要用戶名和密碼的方式
  • ssh 須要公私鑰的方式

啞協議與智能協議:

  • 直觀區別: 啞協議傳輸進度不可見;智能協議傳輸可見。
  • 傳輸速度: 智能協議比啞協議傳輸速度快。

備份特色:可多點備份

git push   // 將本地的變動push到遠端
git fetch  // 將遠端的變動直接拉到本地

git clone --bare https://****** // 不帶工做區的裸倉庫

git push 遠端名稱
複製代碼

三十.註冊一個GitHub帳號

官網https://github.com/

三十一.配置公私鑰

將本地和遠程進行鏈接

在git中找到help,搜索ssh

Adding a new SSH key to your GitHub account

cd ~/.ssh
複製代碼

若已經存在,須要將本地的ssh進行備份

存在一對公私鑰的文件

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
複製代碼

再次查看文件夾: id_rsa爲私鑰,id_rsa.pub爲公鑰。

cat id_rsa.pub // 查看公鑰,以下圖,須要將下面的內容粘貼到遠端的github帳戶
複製代碼

須要將上面的內容粘貼到遠端的github帳戶

能夠有多個 ssh key

用ssh協議的好處: push時不須要用戶名和密碼了,能夠智能識別

三十二.在GitHub上建立我的倉庫

Description:可讓別人快速的搜到你的項目

Add .gitignore

Add a license MIT License開源協議

三十三.把本地倉庫同步到GitHub

git remote -v

git remote add github ****** // 新增遠端站點
複製代碼

fetch:從遠端拉最新的代碼

fast-forward

git pull // 1. git fetch 2.git merge
git fetch origin ***** // 將遠端分支拉到本地,還未與本地的分支產生關聯
git branch -v  // 查看本地分支
git branch -va // 查看遠端分支
git merge github/master // fatal: refusing to merge unrelated histories
讓兩個歷史不想關的樹merge到一塊兒
git help
相同的分支非fast forward
git merge --allow-unrelated-histories github/master // 基於遠端生成了一個新的commit

git push origin master
複製代碼
git remote -v 查看遠程版本庫信息
git remote add githup <url> 添加githup遠程版本庫
git fetch githup 拉取遠程版本庫
git merge -h 查看合併幫助信息
git merge --allow-unrelated-histories githup/master 合併githup上的master分支(兩分支不是父子關係,因此合併須要添加 --allow-unrelated-histories)
git push githup 推送同步到githup倉庫
複製代碼
在不用merge用rebase的狀況下怎麼操做
1)先把遠端的分支 fetch到本地,而後,再執行 rebase 。
2)直接 git pull --rebase 。
複製代碼

fast forward究竟是

  • 本地分支往遠端分支作push,若是遠端分支不是本地分支的祖先,那它倆就不是 fast forward 了。反之,它倆就是fast forward的關係。

三十四.不一樣人修改了不一樣的文件該如何處理

兩我的修改了不一樣的文件

git add -u
git commit -m ""
git push
git branch -av
git fetch // 將遠端的分支拉到本地
git checkout -b feature/add_commands remotes/add_commands
git pull // note about fast-forwards 要變成fast-forwards的關係
git fetch // [ahead 1, behind 1] 遠端有一個commit比本地的新
git merge // merge 遠端分支
git push
複製代碼

標籤管理

git tag                      // 查看全部標籤
git tag name                 // 建立標籤
git tag -a name -m "comment" // 指定提交信息
git tag -d name              // 刪除標籤
git push origin name         // 標籤發佈
複製代碼

三十五.撤銷或回退已經addcommitpush的提交

命令

reset是重置的意思。多觀察一下git reset這個命令。

git reset  【commit ID】
git revert 【commit ID】 // revert能夠保留完整的歷史記錄。對於和其餘人協同的項目,使用git rever是最好的。
複製代碼
git reset 146bd5*****27da72  html/commons/index.html 經過hash直接將某個文件回退到
git checkout html/commons/index.html 回退以後,只是回退到了暫存區,此時還須要用checkout命令將本地的文件刪除掉,再進行commit等操做,這樣本地文件就與遠程一致了
git push --force
複製代碼

commit以後撤回:

git reset --soft HEAD^ (HEAD~1)
撤銷多個commit HEAD~n // 可進行嘗試

參數含義:
--mixed: 不刪除工做空間改動代碼,撤銷commit,而且撤銷git add .
--soft:  不刪除工做空間改動代碼,撤銷commit,不撤銷git add .
--hard:  刪除工做空間改動代碼,撤銷commit,撤銷git add .
複製代碼

commit註釋寫錯,改註釋

git commit --amend
複製代碼

持續更新...

相關文章
相關標籤/搜索