全文結構:html
首先從整體上看,git的存儲、操做:node
主要涉及到四個關鍵點:git
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 -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 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以後
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使用教程(有詳細實例): https://zhuanlan.zhihu.com/p/30044692
git基本操做(精簡手冊):https://juejin.im/post/6844903598522908686