Git是什麼
Author : Huangrichao.黃日超
Time : 2018/09/26
commit -m “註釋格式統一很重要”
如: “黃日超:div分支第3次提交:text.txt添加第四行000000”
與SVN的區別
- SVN是集中式遠程倉庫,每次幹活前必須從網上下載最新版demo,很麻煩
- Git是分佈式版本控制系統,所有倉庫都在本地上,寫作者間僅需傳遞修改部分.
從零入門git指令
1. 創建test文件夾
mkdir /Desktop/GitTest/day_01
2. 進入文件夾
cd /Desktop/GitTest/day_01
3. 初始化文件夾
git init
4. 在day_01內新建一個readme.txt文本
5. 直接提交第一版文件到暫存區
git add readme.txt,方便版本回溯等操作,同時避免多次commit,即commit的一般是定下來的版本,有問題可以用check out將單個文件拿回來
6. 帶註釋一鍵將暫存區文件提交到本地倉庫
git commit -m “readme.txt的第一次提交”
7. 查看工作區是否還有沒add過的新修改(與暫存區對比) git status
返回changes not staged for commit 說明有修改即沒commit更沒add到暫存區裏文件
add前謹慎起見先查看我改了什麼,記得截圖
1. git diff readme.txt
2. add完後立馬git status查看一下,看是否還有沒add的
發現已經全部add過了,且modified過的文件正式readme.txt
3. modify,add,status,第三步纔是commit.
git commit -m "readme文件增加了3333333內容"會把原來index索引目錄裏的一行刪掉,從新添加兩行
4. 再次修改readme.txt添加第三行5555555
繼續addreadme.txt ,status,commit -m "添加第三行內容"
5. 由近及遠查看修改歷史git log(受版本回退影響)
顯示每次提交的版本號,時間,內容
清爽版log指令 git log --pretty=oneline
查看歷史版本與版本號(不受版本回退影響)git relog
無腦回退到上個版本,放棄最新一次的修改 git reset --hard HEAD^ hard是指針 HEAD^上一版本的版本號
用cat readme.txt指令直接在終端查看文件內容是否恢復到上一版本
此時再用git log 發現最新一次的commit已經沒了,只能通過git reflog找,reflog會記錄全部版本指針,log只會顯示當前版本指針之前的版本.
根據註釋找到最新版本,根據版本號恢復最新版本,git reset--hard 6fcfc89
<br />
通過cat readme.txt查看效果
目錄總結
理清工作區,版本倉庫,暫存區的區別
- workspace就是day_01這個被git init過的文件夾中除.git目錄外的全部內容
- repository就是day_01文件夾中的.git目錄.裏面有
- stage 暫存區
- master 自動生成的第一個分支
- HEAD 指向master分支的指針
- 提示changes not staged for commit意思就是還有修改過的文件沒add過
- Changes to be commited 意思就是暫存區裏的文件還沒commit,注意commit必須跟-m “版本信息”
git刪除與修改
在我已經多次add,想要把所有修改commit到分支的時候,突然發現某個地方寫錯了,此時必須刪掉錯誤內容
- git add 過後,及時用git status查看
- 發現可以用git reset HEAD filename 撤銷該文件的add動作
- git reset HEAD test.txt
只是工作區中做了大量修改,尚未add過
- git status
發現在git管理下的文件夾中,git可以直接撤銷某個文件的修改 discard changes in working directory - 撤銷文件修改 git checkout – test.txt
兩種情況
- 一種test.txt從未add過,撤銷就是撤銷工作區的修改
- 一種是test.txt曾經add過,又被修改,撤銷就是恢復到剛add後的狀態,工作區內容也恢復
恢復總結
- 修改部分還未add的,用git checkout – filename 撤銷修改
- 修改部分已經add了,用git reset HEAD filename 撤銷add,但保留修改,需配合git checkout – filename使用
- 修改部分不但add了,還commit了.用git reset --hard HEAD^退回到上一版本
- 退回到特定版本先git reflog查看特定commit節點的版本號,再git reset --hard 版本號即可將代碼退回到特定版本
- commit指針指向哪個commit版本,代碼就變成哪個版本
指針總結
分支與HEAD都是指針,HEAD指向當前分支,分支指向提交
- 創建分支 git branch test
- git log 查看當前指向的commit節點
- 在當前commit節點切換分支,git checkout test.當然,commit節點不變
- 切換當前commit節點 git reflog ; git reset --hard 版本號
刪除總結
對於已commit的文件和代碼,rm filename可直接刪除文件,事後補個commit即可
- 確定刪除,git commit
- 後悔刪除,git checkout – filename 撤銷修改,即撤銷刪除
創建分支
- git branch div
- git checkout div
- 前兩條指令相當於git checkout -b div 創建並切換
- git branch 查看當前分支,工作區與暫存區的內容是所有分支共享的.但是在分支上的提交是獨立的,一旦修改commit提交到該分支的本地倉庫,就標誌此時的本地區是一個全新的版本.
- 一旦切換分支,本地區會恢復到另一個分支的狀態
合併分支
- 因爲我們在div分支上做過一次提交,所以此時div分支已經有了自己的版本記錄,與master不同了,div已經具備了master沒有的修改和特色.
- git採用主合併從的邏輯順序,即我
- master主動合併div,而不是把div合併到master
- 切換到master,git merge div
- 一般採用fast-forward快速合併形式,即直接把div分支的提交指針記錄合併到master的提交指針時間軸上.這操作騷啊~
刪除與恢復分支
- 創建分支本質是修改HEAD的操作,只要HEAD被改了,reflog一定會變,刪除分支只是刪除了相關log裏的HEAD記錄而已
- git branch -d branch_name 會刪除對應非當前分支
- git branch -D branch_name 強制刪除當前在用分支
- git reflog查看歷史HEAD,找到最後一次checkout切換到被刪分支的記錄,找到它的hash值或HEAD編號
- git branch <branch_name> HEAD@{4} 成功恢復
如何解決版本衝突
- 對於test.txt文件
- master分支添加了第四行000000
- div分支與添加了第四行888888
- 此時master執行git merge div會發生conflict
- cat test.txt查看
<<<<
之下表示當前分支的內容=====
隔開兩個分支的不同修改>>>>>
之下表示被合併的分支的內容- 有======的地方說明這兩分支都在同一地方做了修改,現在合併不了
解決矛盾
- 首先git log查看當前分支所有指針修改記錄
- 發現上一屆div分支合併的master的信息也還在,建議以後分支命名帶版本號,如div_01
- 規定不許再master分支上幹活
- 快速合併會導致分支被刪後信息無法復原.git merge -no-ff -m “註釋” div採用禁止快合形式合併
處理bug分支
- 思路
graph LR
bug-->臨時分支
臨時分支-->修復
修復後-->A(合併到主分支)
A-->刪除臨時分支
- 擱置當前工作分支
- 當前工作分支需要3天才能完成,才能提交.而issue-404 bug需要在5小時內完成.怎麼辦?
- 確保當前分支是div,隱藏工作現場git stash 會將工作區+暫存區的內容保存起來
- 切換到master git checkout master
- 在master分支上創建新分支 git checkout -b issue404_bug
- 修復完後,切換到master分支,完成合並,刪除bug分支
- 重回div ; git checkout div
- git status發現工作區很乾淨,需要手動恢復工作現場
- git stash list查看,然後git stash apply恢復,
- 爲防止不同的stash疊加干擾,每次恢復後必須手動刪除stash ; git stash drop
- git stash pop 一步從stash恢復工作現場並刪除stash裏的記錄
鏈接遠程git倉庫
-
git 默認遠程倉庫名爲 origin.可以git remote查看
-
配置好本地.ssh 與git賬戶裏的Key
-
在本地倉庫運行並鏈接到遠程倉庫 git remote add origin https://github.com/huangrichao/testgit.git
-
推送並關聯本地maser與遠程master git push -u origin master
-
想換遠程倉庫,只需git remote rm origin
-
再git remote add origin https://github.com/huangrichao/helloworld.git
-
從現在起,只要本地作了提交,就可以通過
git push origin master
叫代碼推送到遠程倉庫的master分支上 -
遠程倉庫默認master是默認分支,所以本地要是刪了master分支的話,就不能push了.必須先本地創建一個temp分支,遠程也創建一個temp分支,並修改其爲default branch.然後在本地temp push 到遠程temp.最後才能無損刪除本地master分支.
查看遠程倉庫與本地各個分支提交情況
- git remote add origin http://github.com/huangrichao/testgit定義origin綁定的遠程倉庫後
- git remote -v
- git branch -vv
- git push origin master會將本地master推到遠程master
- git push origin div會將本地div分支推送到遠程div
多人協作
- 已知甲分別推送了master和div分支到遠程倉庫
- 乙在文件夾裏git clone url克隆代碼的同時,本地master也會自動關聯到遠程master
- 乙想繼續甲針對div分支做開發,必須創建分支並使用origin/div鏈接 git checkout -b div origin/div
- 乙創建並切換到div分支後,修改了test.txt文件,add,commit後,通過git push origin div推送到遠程testgit倉庫的div分支
- 此時甲想繼續工作,必須先git pull origin div.不管三七二十一先拉取最新版總沒錯.
- pull完後甲再修改,add,commit,最後push
- 很有可能的情況是,在你pull到push的這段時間了,你的同事先你一步做了push.你就悲劇了.push -f強制覆蓋線上版本也不行,除非你能承受覆蓋同事工作成果的後果.只能先pull下來,merge一下,根據衝突報錯手動解決衝突.最後再提交.如果此時又被人先push了,那真是悲劇中的悲劇
- 所以一般程序員們團隊開發時很少會有兩個人同時開發一個模塊的做法.簡直要打架.
刪除總結
- git rm filename 是刪除已commit的文件的
- git rm origin [url] 是刪除遠程倉庫鏈接的
- git branch -d div 是刪除非當前分支的
- git branch -D div 是刪除當前分支的
下載修改再上傳
1. mkdir directory
2. cd directory
3. git clone https://github.com/huangrichao/godEyes.git
4. 修改完後 git remote add upstream https://github.com/huangrichao/godEyes.git
5. git remote -v
6. git diff
7. git add .
8. git commit -m “命名規範版”
9. git push origin master
輸入username與password
huangrichao huang123581321