Git 命令行操作
全文結構:
1)倉庫概念
首先從總體上看,git的存儲、操作:
主要涉及到四個關鍵點:
工作區(workspace):本地電腦存放項目文件的地方,比如learnGitProject文件夾;
暫存區(Index/Stage):在使用git管理項目文件的時候,其本地的項目文件會多出一個.git的文件夾,將這個.git文件夾稱之為版本庫。其中.git文件夾中包含了兩個部分,一個是暫存區(Index或者Stage),顧名思義就是暫時存放文件的地方,通常使用add命令將工作區的文件添加到暫存區里;
本地倉庫(Repository):.git文件夾里還包括git自動創建的master分支,并且將HEAD指針指向master分支。使用commit命令可以將暫存區中的文件添加到本地倉庫中;
遠程倉庫(Remote):不是在本地倉庫中,項目代碼在遠程git服務器上,比如項目放在github上,就是一個遠程倉庫,通常使用clone命令將遠程倉庫拷貝到本地倉庫中,開發后推送到遠程倉庫中即可;
2)分支概念
1)分支介紹:
develop分支(唯一):用于平時開發的主分支,并一直存在,永遠是功能最新最全的分支。
feature分支(N個):用于開發新的功能的分支,一般是多個員工一人一個feature遠程分支。
release分支:用于發布準備的專門分支。
master分支(唯一):最為穩定、隨時可發布的代碼;所有在 master 上的提交都必要要有 tag ,方便回滾。
hotfix分支:用于修復線上代碼的 bug
2)分支關系:
develop和master是2個主要分支,這兩個都是唯一的;
其他的3種分支都是從這2個分支派生出來的:
feature從develop拉出,并回到develop
release從develop拉出,并推送到develop+master兩個分支(保證同步)
hotfix從master拉出,并推送到develop+master兩個分支(保證同步)
3)特性總結:
生命周期:
feature和hotfix是臨時的
其他3個都是長期存在
直接開發:
從不:master、release
不建議:develop
直接:feature、hotfix(和臨時對應)
一、基礎流程
首次需:
0. git init初始化新倉庫(init 好像沒啥用)
1. 到代碼文件夾,右擊 Git Bash Here,打開到本文件路徑
2.git clone + GitHub網頁上Repository復制下來的URL
3. 此時是遠程分支是origin/master(origin層次下的master分支);本地分支是默認的master;需要切換遠程分支和本地分支:
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 originjqy:jqy001本地分支提交到遠程分支
(9.) 如果push的時候顯示沖突(有人改了對應的遠程分支),就先pull一下:
git pull origin jqy001
對比沖突,解決后再push
10.然后在網頁中Submit MR,比如從jqy001==>dev
等待代碼審核即可...
二、分支管理
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:
三、團隊開發 - 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 originjqy:jqy001 本地分支提交到遠程分支
成功的話,然后在網頁中Submit MR
(然后就會由管理員審核MR并提交UAT測試環境。。)
Merge Request(這種方法一般在push的時候會被卡主)
1)git checkout -b xxx(xxx是新建分支的名字,如feature_i)
2) git add . git commit -m "..." git push originxxx //在自己的xxx分支的操作
3.1)git checkout master git mergexxx git push originmaster//切換到master進行合并【命令行版】
3.2) (一定確保第2步有git push originxxx)然后在gitlab界面進行merge request的信息填寫 【GUI版,適用于代碼審核】
四、解決沖突
git mergedev // 一般將dev分支的修改merge到master分支上
merge的時候,如果有同時修改的內容, 就發生沖突(此時無法自動merge),需要查看conflict然后手動合并。
一開始兩個不同的分支同時修改master的readme文件:
第一個merge的不會出問題,
第二個merge時候:
在git mergefeature_1之后,查看feature_1的文件,會顯示比對信息:
手動修改readme文件(不用切換到feature_1分支),
然后在master分支上面,add+commit
然后直接 git push origin master就好了(可以在gitlab 網頁GUI上面直接看一下驗證):
【另一種方式push】
第二個push出現沖突時:
然后git pull
修改、git add、git commit
然后再push就好
五、回退版本(時光穿梭機)
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 --hardHEAD~1 回退1個提交(徹底回退,沖掉回退的信息)
git reset --softHEAD~1 回退1個提交+保留代碼修改信息
git reset --hardd311cd2 ==》先用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 --hardd311cd2根據后面的commit -m "..."信息,找到對應的id,進行自由回退 (很好用!)
六、忽略文件.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狀態),然后再提交:
gitrm-r--cached.
gitadd.
gitcommit-m'update.gitignore'
PS:理解CRLF / LF
CRLF回車換行。
Windows換行方式 CRLF==carriage return line feed
LF換行。
Linux&Unix換行方式 LF== line feed
本來在自己的 Ubuntu 系統上跑的很好,覺得沒bug就提交了。然而,同事使用的是Windows系統,他編譯之后怎么跑都不正常。
在Windows系統上換行符是CRLF, 兩個字符,只刪除
是不夠的。所以在讀取文件的時候一定要小心跨平臺。
Git 提供了一個名為core.autocrlf的配置,可以自動完成標準化與轉換。它的設置方式如下:
git config --global core.autocrlf [true | input | false] # 全局設置 git config --local core.autocrlf [true | input | false] # 針對本項目設置
true:CRLF <=> LF
input:CRLF => LF
false:不變
注意:
CRLF 與 LF 混合的文本文件不受此配置控制。
Git 安裝后默認為 false
使用 Windows 系統的開發者設置:
git config --global core.autocrlf true
使用 Linux/MacOS 的開發者設置:
git config --global core.autocrlf input
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
總結
- 上一篇: 牛哪里的肉最好吃 揭秘牛肉的最佳部位?
- 下一篇: 做肠镜痛苦吗(做肠镜,到底疼不疼?)