git 你需要知道的小技巧

拉取遠(yuǎn)程git項(xiàng)目的某個(gè)分支


  • master分支:默認(rèn)會(huì)拉取的分支,直接git clone URL就可以獲取到。
    $ git clone https://git.oschina.net/androidJP/Demo.git
    
  • 非master分支:需要git fetchgit checkout -b XXX remote倉庫/XXX結(jié)合使用。
    $ git clone https://git.oschina.net/androidJP/Demo.git
    ///項(xiàng)目的默認(rèn)分支被克隆下來了
    $ git branch
    /// 輸出:如master 等已經(jīng)拉取到的分支名和當(dāng)前分支
    $ git fetch
    $ git checkout -b develop origin/develop
    /// 拉取遠(yuǎn)程的develop分支并本地切換到了develop分支
    

本地分支pull不了


原因:你的本地分支沒有關(guān)聯(lián)上遠(yuǎn)程分支.

  • 方法一:直接指定要pull哪個(gè)遠(yuǎn)程分支(默認(rèn)會(huì)merge):
    $ git pull origin <遠(yuǎn)程分支名>
    
  • 方法二:綁定某個(gè)分支,之后就直接git pull 即可:
    $ git branch --set-upstream-to=origin/<遠(yuǎn)程分支名>  <本地分支名>
    

本地創(chuàng)建一個(gè)新分支并推送到遠(yuǎn)程,讓遠(yuǎn)程也生成新分支


$ git checkout -b branchA
....
$ git add . 
$ git commit -m "what you change"
/// 將本地分支推到遠(yuǎn)程的同名分支上
$ git push origin branchA
或者  (-u 的作用是選定默認(rèn)遠(yuǎn)程倉庫)
$ git push -u origin branchA

版本回滾和還原


  1. 回滾
  • 法一:通過git log查看版本號(hào),然后通過版本號(hào)來定位HEAD應(yīng)該指向哪里。
    $ git log --pretty=oneline
    $ git reset --hard 12345
    
  • 法二:通過HEAD^ 等,回滾到上一個(gè)/上N個(gè)版本
    // 上個(gè)版本
    $ git reset --hard HEAD^
    //上上個(gè)版本
    $ git reset --hard HEAD^^
    // 前100個(gè)版本
    $ git reset --hard HEAD~100
    
  1. 還原
    原理:還是使用reset --hard <版本號(hào)>的方式實(shí)現(xiàn),并通過git reflog來獲取以前的git操作記錄,從而得到對(duì)應(yīng)的版本號(hào)。
$ git reflog
$ git reset --hard 12345

不小心寫了句“老板真欠扁”,怎么辦?


  1. 如果你已經(jīng)commit了
    恭喜你,只能用版本回滾了。(如果老板沒有你最新提交版本的版本號(hào)的話)
  2. 幸好,我的文件還在工作區(qū),沒有被add。
    ///將我這個(gè)文件myFile.txt的所有修改都清空
    $ git checkout -- myFile.txt
    
  3. 哦哦,我的文件add進(jìn)了暫存區(qū)。
    // 第一步,還原 add 這個(gè)操作(暫存區(qū) --> 工作區(qū))
    $ git reset HEAD myFile.txt
    // 第二步,清空工作區(qū)(工作區(qū) --> 未修改)
    $ git checkout -- myFile.txt
    

SSH 公約私鑰生成


///在你的用戶主目錄下的 .ssh 文件夾中生成公鑰和私鑰
$ ssh-keygen -t rsa -C "youremail@example.com"

分支的原理


  1. 原理:
    • HEAD永遠(yuǎn)指向當(dāng)前分支。
    • 默認(rèn):HEAD 指向 master,master指向最新提交。
    • 合并分支,是:站在待合并分支上,將這個(gè)分支點(diǎn)的指針,指向要合并到的分支指針位置。
  2. 相關(guān)命令:


分支合并與沖突解決


  1. 本地兩個(gè)分支的merge沖突解決:
    1. 合并
    $ git checkout develop
    $ git merge  newBranch1
    
    1. 合并后,發(fā)現(xiàn)沖突,一般表現(xiàn)形式如下:
    ..............
    <<<<<<< HEAD
    分支 develop 上的內(nèi)容
    =======
    分支 newBranch1上的修改內(nèi)容
    >>>>>>> newBranch1
    
    1. 自己用編輯器打開文件進(jìn)行解決。
    2. 最后addcommit 提交,這樣,就完成了一個(gè)分支的合并。
  2. 使用--no-ff禁止fast forward提交,以保留合并的分支信息,在分支被刪除后,也會(huì)保留分支的合并記錄。
    1. 合并
    $ git merge --no-ff -m "merge with no-ff" dev 
    
    1. (可選)解決沖突
    2. 查看分支合并信息
    $ git log --graph --pretty=oneline --abbrev-commit
    

遠(yuǎn)程倉庫


  1. 創(chuàng)建
    $ git remote add origin git@github.com:michaelliao/learngit.git
    
  2. 推送
    /// 第一次推送,-u 作用是將本地倉庫與遠(yuǎn)程倉庫origin 綁定
    $ git push -u origin master 
    
    /// 以后的推送,則不需要再次綁定了
    $ git push origin master
    
  3. 查看遠(yuǎn)程庫信息
    $ git remote  /// 遠(yuǎn)程庫名
    $ git remote -v ///詳細(xì)信息
    
  4. 查看遠(yuǎn)程分支
    $ git branch -a  ///查看所有分支(包括本地和遠(yuǎn)程倉庫)
    $ git branch 
    
  5. 刪除遠(yuǎn)程分支
    $ git branch -r -d origin/develop    /// 刪除遠(yuǎn)程分支develop
    $ git push origin :develop   ///刪除遠(yuǎn)程的develop分支
    

log 妙用


  1. git log --pretty=oneline:?jiǎn)涡胁榭串?dāng)前分支日志
  2. git log --graph --pretty=oneline:查看當(dāng)前分支的合并情況
  3. git log --graph --pretty=oneline --abbrev-commit:和命令2效果相似。

dev分支碼到一半,發(fā)現(xiàn)master分支的版本有bug,要馬上改


思路:dev的修改先保存起來,然后切換到master分支,再打bug分支修復(fù)bug,修復(fù)成功并合并后,最終切回dev分支,并取回之前保存的dev分支的修改內(nèi)容,繼續(xù)碼。
步驟

  1. 暫存dev工作現(xiàn)場(chǎng)
    $ git stash
    
  2. 切回master, 打bug修復(fù)分支,修復(fù)并合并
    $ git checkout master
    $ git checkout -b bug-solve-101
    ////修復(fù)bug中。。。。
    $ git checkout master
    $ git merge --no-ff -m "bug 101修復(fù)成功" bug-solve-101
    
  3. 最終,切回dev分支,并還原工作現(xiàn)場(chǎng)
    $ git stash pop   /// 還原現(xiàn)場(chǎng),并清除存儲(chǔ)棧中的內(nèi)容
    /// $ git stash list /// 查看存儲(chǔ)棧中的工作現(xiàn)場(chǎng)列表
    /// $ git stash apply  ///只恢復(fù),不刪除棧
    /// $ git stash drop /// 刪除棧存儲(chǔ)區(qū)
    

fetch 和 pull 的區(qū)別


  • $ git fetch origin develop:只是拉取遠(yuǎn)程的develop分支的最新提交版本,到本地的.git/refs/remotes 目錄【遠(yuǎn)程版本庫】中,并沒有合并到本地分支,也就是本地分支仍然只有master,沒有develop.【本地版本庫目錄:.git/refs/heads
  • $ git pull origin develop:相當(dāng)于:git fetch origin develop+git merge develop; 獲取遠(yuǎn)程develop分支,并將其合并到當(dāng)前你所在的本地分支。

讓本地分支追溯到遠(yuǎn)程某個(gè)分支


如果發(fā)現(xiàn),自己創(chuàng)建的本地分支pull不了,那么,可能是本地分支沒有與遠(yuǎn)程分支建立關(guān)聯(lián),這時(shí):

git branch --set-upstream-to=origin/<branch> develop

就可以建立連接,之后,就是各種push、pull和merge了!

Pull 不下來怎么辦?


  • 如果發(fā)現(xiàn)是這種報(bào)錯(cuò):fatal: refusing to merge unrelated histories【在新建Ionic項(xiàng)目的時(shí)候經(jīng)常這樣】,那么,用這條語句來pull:
    git pull origin master --allow-unrelated-histories
    

git clone 指定目錄


如果我們不想每次先cd到那個(gè)目錄在進(jìn)行clone操作,那么,這句命令很有用:

git clone <git url> "C:\a\b"

其中:a表示指定目錄,b表示你自定義的文件夾名,如:

>git clone https://github.com/androidjp/xxxxx.git "D:\aaa\bbb"

最終,會(huì)創(chuàng)建aaa\bbb目錄和文件夾,然后在內(nèi)部拉取所有代碼。

Lag標(biāo)簽


  1. git tag <name>:新建一個(gè)標(biāo)簽,默認(rèn)為HEAD,也可以指定一個(gè)commit id;
  2. git tag -a <tagname> -m "blablabla...":可以指定標(biāo)簽信息;
  3. git tag -s <tagname> -m "blablabla...":可以用PGP簽名標(biāo)簽;
  4. git tag:可以查看所有標(biāo)簽
  5. git push origin <tagname>:可以推送一個(gè)本地標(biāo)簽;
  6. git push origin --tags:可以推送全部未推送過的本地標(biāo)簽;
  7. git tag -d <tagname>:可以刪除一個(gè)本地標(biāo)簽;
  8. git push origin :refs/tags/<tagname>:可以刪除一個(gè)遠(yuǎn)程標(biāo)簽。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1.git的安裝 1.1 在Windows上安裝Git msysgit是Windows版的Git,從https:/...
    落魂灬閱讀 12,849評(píng)論 4 54
  • FMDB的下載地址: FMDB FMDB里面有三個(gè)基礎(chǔ)的類: 1.FMDatabase 實(shí)例化后用來操作數(shù)據(jù)庫,執(zhí)...
    烏拉拉zzZ閱讀 738評(píng)論 0 7
  • 這本書寫了一些人和一些寫給父母的書信。開場(chǎng)白以——永遠(yuǎn)的夏娃開始,一個(gè)三毛想了很久很久的題目。為了一個(gè)有各種遭遇的...
    夏子墨0527閱讀 1,483評(píng)論 0 0

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