Git 命令行操做

全文結構:html


倉庫概念

首先從整體上看,git的存儲、操做:node

 

主要涉及到四個關鍵點:git

  1. 工做區(workspace):本地電腦存放項目文件的地方,好比learnGitProject文件夾;
  2. 暫存區(Index/Stage):在使用git管理項目文件的時候,其本地的項目文件會多出一個.git的文件夾,將這個.git文件夾稱之爲版本庫。其中.git文件夾中包含了兩個部分,一個是暫存區(Index或者Stage),顧名思義就是暫時存放文件的地方,一般使用add命令將工做區的文件添加到暫存區裏;
  3. 本地倉庫(Repository):.git文件夾裏還包括git自動建立的master分支,而且將HEAD指針指向master分支。使用commit命令能夠將暫存區中的文件添加到本地倉庫中;
  4. 遠程倉庫(Remote):不是在本地倉庫中,項目代碼在遠程git服務器上,好比項目放在github上,就是一個遠程倉庫,一般使用clone命令將遠程倉庫拷貝到本地倉庫中,開發後推送到遠程倉庫中便可; 

 


1、基礎流程
github

首次需:緩存

0. git init  初始化新倉庫(init 好像沒啥用)服務器

1. 到代碼文件夾,右擊 Git Bash Here,打開到本文件路徑ide

2. git clone + GitHub網頁上Repository複製下來的 URLgitlab

3. 此時是遠程分支是origin/master(origin層次下的master分支);本地分支是默認的master;須要切換遠程分支和本地分支:post

  git checkout -b  jqy-local-dev(本地分支名)origin/dev(遠程分支名)
學習

(若是沒有這一步的操做,就會從master拉取,由於SSH的url只有一個)

3.1先用 git branch -a 查看全部本地+遠程分支

 3.2 切換分支

  注意上圖中本地分支已經切換,origin/dev是根據須要選擇的遠程分支,遠程分支改變後,本地文件會由origin/master這個遠程分支變爲你選擇的遠程分支

 (ps: 將本地分支和遠程分支關聯的操做通常只用於拉取的時候,然後面就不用管這個關聯了,由於git push origin jqy 這個指令通常不用,都不會原路推到代碼來源如dev遠程分支,而是push到本身的遠程分支,而後MR等待評審再合併到須要的分支)

 

後續:

不斷編碼修改...

4. cd到新文件夾中,Git Bash

5. git add .   (注意" . "不能省略,此操做是把文件夾下面新的文件或修改過的文件添加進來,若是有的文件以前已經添加了,它會自動省略)

6. git commit  -m  "提交信息" (提交的信息是你的項目說明)

7.(配置好用戶名、郵箱)

8. git push origin master   

    git push [remote-name] [branch-name]

(此操做目的是把本地倉庫push到github上面,此步驟須要你輸入登陸github上的賬號和密碼)

(通常團隊開發都用 git push origin jqy:jqy001這樣推到本身的遠程分支,而後提交MR;而不是直接push就完事)

git push origin jqy:jqy001 本地分支提交到遠程分支

(9.) 若是push的時候顯示衝突(有人改了對應的遠程分支),就先pull一下:

git pull origin jqy001

對比衝突,解決後再push

10. 而後在網頁中Submit MR,好比從jqy001==>dev

等待代碼審覈便可...

 

 

2、分支管理

git branch  查看本地分支; 

git branch -a  查看全部分支(包括遠程

 

上方是本地分支區,下方origin一堆是遠程分支;箭頭指向的是當前本地分支、遠程分支

 


 git checkout -b [branchname]    建立+切換 分支

  • git branch dev   建立分支(這個通常用不上)
  • git checkout dev   切換分支(此處的dev能夠爲git reflog的七位數字)

 

git branch -d [local-branch-name]    刪除分支(本地)

git branch -r -d [remote-branch-name]    刪除(遠程remote)分支

 


 修復上一個版本的bug:

1. git log找到bug版本的版本號 

2.git branch 1db3731將HEAD移動到bug版本

3.git branch -b myfixbug而後開始在此分支修改bug 

4.等到master裏面到下一個版本上線以前,合併myfixbug

最好看着IDEA中的版本線狀圖===》》》

順便學習Github/CodeHub團隊開發策略(分支策略)總結下來


  • git push origin master  //push到origin的master分支
  • git push origin dev  //push到origin的dev分支

git remote -v   查看鏈接SSH的url   (遠程庫的默認名稱是origin

 


 git branch -v  

git branch -vv   

顯示local分支對應的遠程分支

 


 設置origin:

 

 

 

3、團隊開發 - MR提交

在團隊合做軟件開發方面,通常有master分支和develop分支,

開發者先發送merge request請求到develop上,而後經過 項目管理者review以後,纔會merge到master分支上。

 


 Merge Request

(建議在IDEA裏面進行,由於方便對照修改的內容):

git branch -b jqy 建本身的本地分支

git add 須要修改的文件(最好不要用git add . 由於這樣會add上一些無用的東西)

git commit (提交到本身的本地)

git pull origin jqy001 (與origin中jqy001這個遠程分支進行對比,修復衝突,並提交須要上線的文件)

git push origin jqy:jqy001 本地分支提交到遠程分支

成功的話,而後在網頁中Submit MR

(而後就會由管理員審覈MR並提交UAT測試環境。。)

 


 Merge Request(這種方法通常在push的時候會被卡主)

1) git checkout -b xxx (xxx是新建分支的名字,如feature_i)

2) git add .       git commit -m "..."       git push origin xxx   //在本身的xxx分支的操做

3.1) git checkout master      git merge xxx     git push origin master //切換到master進行合併【命令行版】

3.2) (必定確保第2步有git push origin xxx)而後在gitlab界面進行merge request的信息填寫 【GUI版,適用於代碼審覈】

 

 

 

4、解決衝突

git merge dev       // 通常將dev分支的修改merge到master分支上

merge的時候,若是有同時修改的內容, 就發生衝突(此時沒法自動merge),須要查看conflict而後手動合併。


 一開始兩個不一樣的分支同時修改master的readme文件:

第一個merge的不會出問題,

第二個merge時候:

 

 在 git merge feature_1以後,查看feature_1的文件,會顯示比對信息:

 

手動修改readme文件(不用切換到feature_1分支),

而後在master分支上面,add+commit 

 

 而後直接 git push origin master就行了(能夠在gitlab 網頁GUI上面直接看一下驗證):

 


 【另外一種方式push】

第二個push出現衝突時:

而後git pull

修改、git add、git commit

而後再push就好

 

 

5、回退版本(時光穿梭機)

git status   查看工做目錄、暫存區的狀態

git diff    查看修改內容  (Git跟蹤並管理的是文件的修改,而非文件自己)

  git diff 詳細命令: https://www.jianshu.com/p/80542dc3164e

git log   查看日誌(一次次commit修改狀況,注意是以commit爲粒度)

   (git log -p  可看到具體修改內容。按Enter向下閱讀)

 


 

 

1)已經commit以後

  • git reset --hard HEAD~1  回退1個提交(完全回退,沖掉回退的信息)
  • git reset --soft HEAD~1  回退1個提交+保留代碼修改信息
  • git reset --hard d311cd2  ==》先用git reflog 查看各個版本的 commit id(如d311cd2)進行自由回退  (很好用!)

 2)已經add,但沒有commit(錯誤還在 stage暫存區)

兩步操做:

git reset HEAD [filename]       

git checkout -- [filename]  

 3)尚未add(錯誤還在 工做區)

只須要一步:

git checkout -- [filename]

(這樣操做的粒度比較小;reset的話,粒度比較大;由於通常是一次commit是一到屢次add的總和)


 

分析下粒度:

屢次add,一次commit;

屢次commit,一次push;

因此:

commit後的reset --hard 序號《==》1~n次的commit的粒度

add後的reset HEAD《==》回退到上次commit後的狀態,至關於1~n次的add的粒度

add前的 checkout -- [filename] 《==》回退到上次add後的狀態,至關於1次add內的粒度

 


詳細說明git reset:

 git reset --hard HEAD^   硬回退一步

(此時本地回退了,可是遠程沒有回退;若是須要遠程也回退,就要git push origin xxx再提交一下)

 

git reflog 查看各個版本的 commit id(如d311cd2)

git reset --hard d311cd2  根據後面的commit -m "..."信息,找到對應的id,進行自由回退  (很好用!)

 

 

 

6、忽略文件  .gitignore

1)規則

/   //表示目錄

*  //匹配 任意個字符

?  //匹配 一個字符
 [ ] // 正則匹配 一個字符

!  //表示忽略匹配

2)示例

# 此爲註釋 – 將被 Git 忽略

*.log    #表示全部的 .log文件(也包括子目錄裏的)
*.iml    *.ipr    *.iws *.txt       # 忽略全部 .txt 結尾的文件
!Readme.txt    # 但 Readme.txt 除外

/TODO     # 僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO
/node_modules hello[0-9].txt .settings/   # 忽略settings文件裏的所有
.idea/   .vscode/   target/   .gradle   /config build/    # 忽略 build/ 目錄下的全部文件
doc/*.txt    # 會忽略 doc/notes.txt 但不包括 doc/server/arch.txt

/fd1/*    #忽略根目錄下的 /fd1/ 目錄的所有內容;
fd1/*    #忽略目錄 fd1 下的所有內容;注意,不論是根目錄下的 /fd1/ 目錄,仍是某個子目錄 /child/fd1/ 目錄,都會被忽略;

   

 


  想把某些目錄或文件加入忽略規則,按照上述方法定義後發現並未生效,緣由是.gitignore只能忽略那些原來沒有被track的文件,若是某些文件已經被歸入了版本管理中,則修改.gitignore是無效的。那麼解決方法就是先把本地緩存刪除(改變成未track狀態),而後再提交:

git rm -r --cached .
git add .
git commit -m 'update .gitignore'


 

 

 

 ps:IDEA界面化Git操做

更多內容參見:《Git -- IDEA界面操做》

    

 

命令行操做是git的根基,在此基礎上的 IDEA界面操做,功能更加可視化、易於理解。

 

 


參考   git使用教程(有詳細實例): https://zhuanlan.zhihu.com/p/30044692 

     git基本操做(精簡手冊):https://juejin.im/post/6844903598522908686

     廖雪峯git:https://www.liaoxuefeng.com/wiki/896043488029600

最後去練習吧:https://learngitbranching.js.org/?locale=zh_CN

相關文章
相關標籤/搜索