常用git操作

先看一個綜合示例:
在穩(wěn)定版本上創(chuàng)建一個新的分支new,用于開發(fā)新功能

 git branch new   //在穩(wěn)定版本上創(chuàng)建一個新的分支,開發(fā)新功能

開發(fā)了一段時間后,穩(wěn)定版本發(fā)現(xiàn)bug, 需要緊急修復(fù),于是切回穩(wěn)定版本

 git checkout master  //回到穩(wěn)定版本 

在穩(wěn)定版本基礎(chǔ)上,創(chuàng)建并切換到用于修復(fù)bug的hotfix 分支

 git checkout -b hotfix   //在穩(wěn)定版本基礎(chǔ)上,創(chuàng)建并切換到hotfix 分支

多次提交, 確認bug 修復(fù)成功后, 切回穩(wěn)定版本,并把hotfix合并進來。 由于當(dāng)前 master 分支所在的提交對象是要并入的 hotfix 分支的直接上游,不會有沖突,于是Git 在合并兩者時,只會簡單地把指針右移,“Fast forward”,快進。

git checkout master    //回到穩(wěn)定版本
git merge hotfix   //把hotfix合并進來,出現(xiàn)了“Fast forward”,快進

由于當(dāng)前 hotfix 分支和 master 都指向相同的提交對象,所以 hotfix 已經(jīng)完成了歷史使命,可以刪掉了

 git branch -d hotfix   // 刪除hotfix 分支

切回new 分支繼續(xù)開發(fā)新功能

 git checkout new    //切回new 分支

開發(fā)完后,回到master,并將new 分支并入進來(可能會產(chǎn)生沖突)

 git checkout master   // 回到master
 git merge new    // 將new 并入進來

如果產(chǎn)生沖突,使用git status 可以看到?jīng)_突的文件, 手動解決沖突后:

 git add .
 git commit -m "conflict fixed"

【注】
通常,合并分支時,如果可能,Git會用Fast forward模式,但這種模式下,刪除分支后,會丟掉分支信息,使用git log --graph查看分支圖時,是一條直線。
如果要強制禁用Fast forward模式( 添加--no-ff參數(shù) ),Git就會在merge時生成一個新的commit,這樣,git log --graph查看分支圖時,能看到分支信息 。

git merge --no-ff -m "merge with no-ff" hotfix  
// --no-ff參數(shù),表示禁用Fast forward,因為本次合并要創(chuàng)建一個新的commit,所以加上-m參數(shù),把commit描述寫進去

一、常用命令

1.克隆

git clone git@github.com:candy252324/testgit.git

若需要重新定義倉庫名稱,則

git clone git@github.com:candy252324/testgit.git xxx   // xxx表示自己要重新定義倉庫的名字

2. add 操作

git add a.js    // 將修改或新增文件納入跟蹤范圍,還可以在合并時把有沖突的文件標記為已解決狀態(tài)等
git add .      // . 表示所有文件
git diff filename      // 查看已被追蹤的文件當(dāng)前狀態(tài)和上一次git add時的區(qū)別

如何在add的時候忽略某個文件:

git add -u   //  -u就是update的意思,只會add本地已經(jīng)追蹤的文件(刪除和修改),不包括新增的
git reset -- foldername/test.js

如何在add的時候忽略整個文件夾:

git add -u 
git reset -- foldername/*

3. commit 操作

git commit  -m  "your commit message"      
// 直接git commit(不帶-m 參數(shù)) 會啟動vim,
// 若暫存區(qū)中沒有文件,將不會提交
// 若是有修改,但未add, 而直接提交,則提交的是修改之前的版本  

git commit --amend -m   "新的提交信息"    //糾正錯誤的提交信息,最終只產(chǎn)生一條提交結(jié)果

4.刪除操作

rm a.js   // 相當(dāng)于在文件管理器中直接刪除

此時git status ,git 知道進行了文件刪除操作,此時有兩種選擇

    1. 確實要從版本庫中刪除該文件

首先 git rm a.js, 然后 git commit -m "delete a.js" ,現(xiàn)在,文件就從版本庫中被刪除了

  • 2.另一種情況是刪錯了
    因為版本庫里還有呢,所以可以很輕松地把誤刪的文件恢復(fù)到最新版本。執(zhí)行 git checkout -- a.js 即可還原。git checkout 是用版本庫里的版本替換工作區(qū)的版本,無論工作區(qū)是修改還是刪除,都可以“一鍵還原”。git checkout [<options>] [<branch>] -- <file>
git rm              //刪除已被添加到暫存區(qū)域,但是未被修改的,(無法刪除修改之后又重新add的文件),整個文件目錄會被刪除
git rm -f xxx       //強制刪除修改過并且已經(jīng)放到暫存區(qū)域的
git mv xxx1 xxx2        //修改文件名字   相當(dāng)于依次執(zhí)行mv xxx1 xxx2,git rm xxx1, git add xxx2

5.回退

在Git中,用HEAD表示當(dāng)前版本(不一定是最新的提交版本),上一個版本就是HEAD^,上上一個版本就是HEAD^^,當(dāng)然往上100個版本寫100個^比較容易數(shù)不過來,所以寫成HEAD~100

git checkout a.js   //取消暫存的文件,并刪除所做的修改(讓文件回到最近一次git commit或git add時的狀態(tài))

git rest HEAD test.js  // git reset HEAD <file>可以把暫存區(qū)的修改撤銷掉(unstage),但是并不丟棄工作區(qū)的修改

git reset --hard HEAD^    // 回退到上一個版本(--hard 表示丟棄工作區(qū)的修改)
git reset --hard HEAD^^   // 回退到上上個版本 
git reset --hard xxx   // xxx 為版本號,表示回到某個版本,此時 git log, 將看不到xxx版本往后的commit信息,

當(dāng)使用 git reset --hard HEAD xxx 回退到xxx版本后,此時 git log, 將看不到xxx版本往后的commit信息,這時如果又想回退到最新版本,卻看不到最新版本的commit hash 值,怎么辦呢?
可以使用 git reflog, 該命令可以看到你執(zhí)行過的所有操作(如:clone,commit,pull,reset等)及對應(yīng)hash值,找到最新版本的hash值,執(zhí)行git reset --hard xxx即可回退到最新版本。

git reflog.png

6. 推送

git push          // 推送當(dāng)前分支上的修改到遠端
git push origin master    // 將master分支上的內(nèi)容推至遠程倉庫
git push origin dev      // 將dev分支上的內(nèi)容推至遠程倉庫

7.分支創(chuàng)建和切換

git checkout -b dev    // 創(chuàng)建并切換到dev分支

以上等同與操作以下兩步:

git branch dev    // 創(chuàng)建一個名為dev的分支
git checkout dev    //將HEAD 切換到dev分支上

git branch 查看本地所有分支, 前面帶有 *號的是當(dāng)前所處的分支:

git branch.png

git branch -a 查看所有分支,包括遠程分支,前面帶有 *號的是當(dāng)前所處的分支,紅色標識的是遠程分支:
git branch -a.png

當(dāng)你的小伙伴從遠程庫clone時,默認情況下,你的小伙伴只能看到master分支。如果小伙伴要在dev分支上開發(fā),就必須創(chuàng)建遠程origin的dev分支到本地:

 git checkout -b dev origin/dev    //創(chuàng)建遠程origin的dev分支到本地,并切換到dev分支

8.分支的刪除

git branch -d dev    // 刪除本地dev分支
git push origin -d dev   // 刪除遠程dev分支

對于一個 commit 過但尚未合并的分支,git branch -d xxx 是無法刪除的,若要強制刪除,需使用 -D參數(shù)

git branch -D dev    // 強制刪除dev分支

9. 查看遠程倉庫信息

git remote   //查看遠程倉庫信息 , 注:遠程倉庫的默認名稱為 origin
git remote -v  // 查看更詳細的遠程倉庫信息

10.查看日志

git log     //查看所有提交日志
git log -5   //查看最近的5次提交記錄
git log --graph   //顯示 ASCII 圖形表示的分支合并歷史  
git log --pretty=format:"%h %an %ar %s"    //hash值,作者,提交時間,提交信息
git log --author "candy"   //只列出指定作者的提交記錄

11.打標簽

Git的標簽雖然是版本庫的快照,但其實它就是指向某個commit的指針(跟分支很像, 但是分支可以移動,標簽不能移動)

git tag v1.0    // 打個標簽(默認標簽是打在最新提交的commit上的)
git tag v0.9 f52c633    //標簽打到某個版本上
git tag       // 查看有哪些標簽 (注意,標簽不是按時間順序列出,而是按字母排序的)
git show v1.0     //查看標簽信息

還可以創(chuàng)建帶有說明的標簽,用-a指定標簽名,-m指定說明文字

git tag -a v0.1 -m "version 0.1 released" 1094adb
git tag -d v0.9   // 刪除打錯的標簽(創(chuàng)建的標簽都只存儲在本地,不會自動推送到遠程。所以,打錯的標簽可以在本地安全刪除) 
git push origin v1.0   // 推送某個標簽到遠程
git push origin --tags   // 一次性推送全部尚未推送到遠程的本地標簽

如果標簽已經(jīng)推送到遠程,要刪除遠程標簽就麻煩一點,需要先從本地刪除:

git tag -d v0.9    // 本地刪除

然后從遠程刪除:

git push origin -d tag v0.9  // 刪除遠程標簽
// 或
git push origin :refs/tags/v0.9      // 刪除遠程標簽

13.merge 和 rebase

現(xiàn)在我們有這樣的兩個分支, dev和master,提交如下

      D---E dev
     /
 A---B---C---F--- master

在dev執(zhí)行git merge master,會得到如下結(jié)果:

     D--------E
    /          \
 A---B---C---F----G---   dev, master

而在dev執(zhí)行g(shù)it rebase master,會得到如下結(jié)果:

A---B---C---F---D'--E'---   test, master

rebase命令會把你當(dāng)前分支(dev)里的每個commit取消掉,并且把它們臨時保存為補丁(patch)(這些補丁放到".git/rebase"目錄中),然后把dev分支更新到最新的"master"分支,最后把保存的這些補丁應(yīng)用到dev分支上。
【使用場景】:
通常使用rebase在個人分支上拉取最新代碼:

git pull origin master --rebase  

使用merge將個人分支合并到公共分支

git merge dev

二、git配置

1. 配置用戶信息

--global參數(shù)是全局參數(shù),也就是這些命令在這臺電腦的所有Git倉庫下都有用

git config --global user.name candy
git config --global user.email candy@example.com

2. 查看配置信息

git config --list          // 檢查已有的所有配置信息
git config user.name     // 查看某一項配置信息

3. 使用幫助

git help      // ??磶椭?git help xxx config    // 查看某一指令的幫助,會自動打開瀏覽器, 如:git  help status config,查看status 指令幫助

4. ignore

*.a            //忽略所有 .a 結(jié)尾的文件  
!lib.a         // 但 lib.a 除外    
*.class      //忽略所有 .class結(jié)尾的文件  
/TODO          //僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO
build/         //忽略 build/ 目錄下的所有文件
doc/*.txt      //會忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/**/*.txt   //忽略 doc/ 目錄下所有擴展名為 txt 的文件

有些時候,你想添加一個文件到Git,但發(fā)現(xiàn)添加不了,原因是這個文件被.gitignore忽略了,如果你確實想添加該文件,可以用 -f 強制添加到Git
git add -f App.class
或者你發(fā)現(xiàn),可能是.gitignore寫得有問題,需要找出來到底哪個規(guī)則寫錯了,可以用 git check-ignore 命令檢查。

$ git check-ignore -v App.class 
.gitignore:3:*.class   App.class     

由輸出結(jié)果可知, .gitignore的第3行規(guī)則忽略了該文件,于是我們就可以知道應(yīng)該修訂哪個規(guī)則

5. 配置別名

  • 很多人都用 st 就表示 status , co 表示 checkout,ci 表示 commit,br 表示 branch
git config --global alias.st status 
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch

以后 git status 就可以寫成 git st, 提交就可以簡寫成 git ci -m "bala bala"

  • 我們知道,命令 git reset HEAD file 可以把暫存區(qū)的修改撤銷掉(unstage),重新放回工作區(qū)。既然是一個unstage操作,就可以配置一個unstage別名, 使得 git unstage test.js 效果等同于 git reset HEAD test.js
git config --global alias.unstage 'reset HEAD'
  • 甚至可以配置如下:
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git lg.png

6.配置文件的位置

  • 每個倉庫的Git配置文件都放在.git/config文件中
    cat .git/config
    別名就在[alias]后面,要刪除別名,直接把對應(yīng)的行刪掉即可
  • 而當(dāng)前用戶的Git配置文件放在C盤用戶主目錄下的一個隱藏文件.gitconfig中


    配置文件.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • Git常用語法 [TOC] Git簡介 描述 ? Git(讀音為/g?t/。)是一個開源的分布式版本控制系統(tǒng),...
    君惜丶閱讀 3,933評論 0 13
  • 今天是孩子們的節(jié)日,下午兒子學(xué)校里舉行合唱比賽,我在群里看到老師們發(fā)的視頻,孩子們都棒棒噠,祝孩子們節(jié)日快樂!...
    元溪媽咪閱讀 132評論 0 0

友情鏈接更多精彩內(nèi)容