目錄結構:
- 第一章 git概述
- 1.1 本地倉庫結構圖
- 1.2 文件狀態
- 1.3 生命周期
- 第二章 git於svn比較
- 第三章 Git及基本特性及應用
- 3.1.獲取git倉庫
- 3.1.1 初始化版本庫
- 3.1.2 首次推送本地項目到遠程倉庫
- 3.1.3 克隆遠程倉庫
- 3.2. 分支管理
- 3.2.1 svn和git
- 3.2.2 本地分支操作
- 3.2.3.分支合並
- 3.3 關於版本回退
- 總結:
- 3.4 撤銷修改
- 1. 存在兩種情況
- 2.處理辦法:
- 總結:
- 3.5 刪除文件
- 3.6.git的暫存功能
- 場景
- 總結
- 3.7.多人協作
- 3.8關於標簽
- 3.8.1 創建標簽
- 3.8.2 操作標簽
- 3.1.獲取git倉庫
- 第四章 git 刪除遠程倉庫文件
- 4.1 預覽將要刪除的文件
- 4.2 確定無誤后刪除文件
- 4.3 提交到本地並推送到遠程服務
- 4.4 修改本地 .gitignore 文件 並提交
第一章 git概述
1.1 本地倉庫結構圖
1.2 文件狀態
已提交(committed):數據已經安全的保存在本地數據庫中。
已暫存(staged):對一個已修改文件的當前版本做了標記,使之包含在下次提交的快照中。
已修改(modified):修改了文件,但還沒保存到數據庫中。
工作流程:
1、檢出工程。
2、在工作目錄中修改文件。
3、暫存文件,將文件的快照放入暫存區域。
4、提交更新,找到暫存區域的文件,將快照永久性存儲到 Git 倉庫目錄。
1.3 生命周期
使用Git 時文件的生命周期:
第二章 git於svn比較
總結對比,如下所示:
|
SVN |
Git |
管理方式 |
集中式 |
分布式 |
聯網 |
Commit/log必須聯網 |
本地可進行任何操作 |
服務端軟件支持 |
必須有服務端 |
不需要 |
數據保存 |
按文件保存 |
按元數據保存 |
分支管理 |
另開一個目錄,完全拷貝一份 |
同一個目錄,文件只一份,存快照 |
第三章 Git及基本特性及應用
3.1.獲取git倉庫
3.1.1 初始化版本庫
在計算機上任意地方創建一個文件夾,進入文件夾目錄右擊鼠標點擊git bash here打開git命令窗口,執行git init命令。
3.1.2 首次推送本地項目到遠程倉庫
將要推送的項目拷貝到本文件夾下,然后執行如下命令:
$ git add . #跟蹤文件並將文件添加到暫存區 $ git commit -m “提交信息” $ git remote add origin git@gitlab.com:mingming/projectName.git(關聯一個遠程庫) $ git push -u origin master |
由於遠程庫是空的,我們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以后的推送或者拉取時就可以簡化命令。
3.1.3 克隆遠程倉庫
git clone git@gitlab.com:mingming/projectName.git(即:[url])
3.2. 分支管理
3.2.1 svn和git
SVN中的分支?
完全拷貝,與其他分支是不同的文件
實踐中往往開發分支沒有及時同步到主分支
結果:開發分支與主分支差異越來越大,以至於無法同步……
本地提交前須update,可能造成:本地代碼正常,update后沖突,解決沖突時不小心覆蓋了自己新加代碼
Git分支
git保存的是快照
不同分支都是在同一份文件上,git保存不同版本快照
分支的遷移很容易 —— 改變“指針”指向
3.2.2 本地分支操作
基本命令:
1)查看分支:git branch
2)創建分支:git branch branch-name
3)切換分支:git checkout branch-name
4)創建並切換分支:git checkout -b branch-name
5)合並某分支到當前分支:git merge <要合並的分支name>
6)刪除分支:git branch -d branch-name(對於未合並的分支,使用此命令無法刪除,需要換成-D強制刪除,但會丟失掉此分支所做的工作)。
7)哪些分支合並到當前分支:git branch --merged(反之,git branch --no-merged)
8)刪除遠程分支:git push origin --delete 遠程分支。
基本上這個命令做的只是從服務器上移除這個指針。 Git 服務器通常會保留數據一段時間直到垃圾回收運行,所以如果不小心刪除掉了,通常是很容易恢復的。
9)git提交歷史查詢:git log --graph --pretty=oneline --abbrev-commit。
3.2.3.分支合並
合並分支時,加上--no-ff參數就可以用普通模式合並,合並后的歷史有分支,能看出來曾經做過合並,而fast forward合並就看不出來曾經做過合並。
可以看到,不使用Fast forward模式,merge后就像這樣:
3.3 關於版本回退
git reset --hard HEAD^或 git reset --hard 版本號(可回到任一個版本)
Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100。
如何獲得刪除掉的版本號:
Git提供了一個命令git reflog用來記錄你的每一次命令。
總結:
- HEAD指向的版本就是當前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id。
- 穿梭前,用git log可以查看提交歷史,以便確定要回退到哪個版本。
- 要重返未來,用git reflog查看命令歷史,以便確定要回到未來的哪個版本。
3.4 撤銷修改
1. 存在兩種情況
1)一種是readme.txt自修改后還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
2)一種是readme.txt已經添加到暫存區后,又作了修改,現在,撤銷修改就回到添加到暫存區后的狀態。
總之,就是讓這個文件回到最近一次git commit或git add時的狀態。
2.處理辦法:
1)對於第一種情況:
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作區的修改全部撤銷。
2)對於第二種情況:
用命令git reset HEAD <file>可以把暫存區的修改撤銷掉(unstage),重新放回工作區,git reset命令既可以回退版本,也可以把暫存區的修改回退到工作區。當我們用HEAD時,表示最新的版本。
通過git reset HEAD <file>回到了第一種情況。
總結:
場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout -- file。
場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD <file>,就回到了場景1,第二步按場景1操作。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。
3.5 刪除文件
現在你有兩個選擇,一種是確實要從版本庫中刪除該文件,那就用命令git rm刪掉,並且git commit。
另一種情況是刪錯了,因為版本庫里還有呢,所以可以很輕松地把誤刪的文件恢復到最新版本:
$ git checkout -- test.txt |
git checkout其實是用版本庫里的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。
3.6.git的暫存功能
場景
軟件開發中,bug就像家常便飯一樣。有了bug就需要修復,在Git中,由於分支是如此的強大,所以,每個bug都可以通過一個新的臨時分支來修復,修復后,合並分支,然后將臨時分支刪除。
當你接到一個修復一個代號101的bug的任務時,很自然地,你想創建一個分支issue-101來修復它,但是,等等,當前正在dev上進行的工作還沒有提交。
並不是你不想提交,而是工作只進行到一半,還沒法提交,預計完成還需1天時間。但是,必須在兩個小時內修復該bug,怎么辦?
幸好,Git還提供了一個stash功能,可以把當前工作現場“儲藏”起來,等以后恢復現場后繼續工作:
$ git stashSaved working directory and index state WIP on dev: f52c633 add merge |
現在,用git status查看工作區,就是干凈的(除非有沒有被Git管理的文件),因此可以放心地創建分支來修復bug。
修復完成后,切換到master分支,並完成合並,最后刪除issue-101分支。
現在,是時候接着回到dev分支干活了!
$ git checkout dev |
工作區是干凈的,剛才的工作現場存到哪去了?用git stash list命令看看:
$ git stash liststash@{0}: WIP on dev: f52c633 add merge |
工作現場還在,Git把stash內容存在某個地方了,但是需要恢復一下,有兩個辦法:
一種方式:用git stash apply恢復,但是恢復后,stash內容並不刪除,你需要用git stash drop來刪除;
另一種方式:用git stash pop,恢復的同時把stash內容也刪了:
$ git stash pop On branch dev Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: hello.py Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: readme.txt Dropped refs/stash@{0} (5d677e2ee266f39ea296182fb2354265b91b3b2a) |
再用git stash list查看,就看不到任何stash內容了:
$ git stash list |
你可以多次stash,恢復的時候,先用git stash list查看,然后恢復指定的stash,用命令:$ git stash apply stash@{0}
總結
修復bug時,我們會通過創建新的bug分支進行修復,然后合並,最后刪除;
當手頭工作沒有完成時,先把工作現場git stash一下,然后去修復bug,修復后,再git stash pop,回到工作現場。
3.7.多人協作
查看遠程庫信息,使用git remote -v;
本地新建的分支如果不推送到遠程,對其他人就是不可見的;
從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠程的新提交;
在本地創建和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致;
建立本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name;
從遠程抓取分支,使用git pull,如果有沖突,要先處理沖突(手動處理)。
3.8關於標簽
3.8.1 創建標簽
命令git tag <tagname>用於新建一個標簽,默認為HEAD,也可以指定一個commit id;
命令git tag -a <tagname> -m "blablabla..."可以指定標簽信息;
命令git tag可以查看所有標簽。
命令git push origin <tagname>可以推送一個本地標簽;
命令git push origin --tags可以推送全部未推送過的本地標簽;
命令git tag -d <tagname>可以刪除一個本地標簽。
3.8.2 操作標簽
命令git push origin <tagname>可以推送一個本地標簽;
命令git push origin --tags可以推送全部未推送過的本地標簽;
命令git tag -d <tagname>可以刪除一個本地標簽。
命令git push origin :refs/tags/<tagname>可以刪除一個遠程標簽。
第四章 git 刪除遠程倉庫文件
第四章 git 刪除遠程倉庫文件
項目開發初期由於.gitignore 文件配置不正確很有可能導致某些不需要的目錄上傳到 git 遠程倉庫上了,這樣會導致每個開發者提交的時候這些文件每次都會不同。除了一開始提交的時候注意配置好 .gitignore 文件外,我們也需要了解下出現這種問題后的解決辦法。
具體操作步驟如下:
4.1 預覽將要刪除的文件
git rm -r -n --cached 文件/文件夾名稱加上 -n 這個參數,執行命令時,是不會刪除任何文件,而是展示此命令要刪除的文件列表預覽。 |
4.2 確定無誤后刪除文件
git rm -r --cached 文件/文件夾名稱 |
4.3 提交到本地並推送到遠程服務
git commit -m "提交說明" git push origin master |
4.4 修改本地 .gitignore 文件 並提交
git commit -m "提交說明" git push origin master |