Git 教程 -- 基於自己學習記錄
Git 教程 -- 基於自己學習記錄
1. 引言
由於學校布置了一項熟悉 git 和 svn 操作的實驗,所以自己重新溫習了下 git,記錄過程在這。
2. 註冊登錄 GitHub。
3. 選擇一個倉庫克隆到本地,這裏以我自己的一個私人項目為例,克隆到本地。
git clone https://github.com/weixuqin/love_source.git //克隆項目到本地
4. 創建dev 分支,並切換到dev分支。
git checkout -b dev //創建dev分支
git branch //查看當前分支
合並分支, 刪除分支。
vim README.md //修改操作 git add README.md //提交 git commit -m "branch test" //提交 git checkout master //切回master分支 git merge dev //合並分支 git branch -d dev //刪除dev分支 git branch //查看當前分支
衍合分支。
git rebase dev
合並(merge)和衍合的區別:
merge把兩個分支最新的快照以及兩者的共同祖先進行三方合並,合並的結果是產生一個新的提交對象。
衍合是把在一個分支裏發生的變化補丁在另一個分支重新打一遍。
衍合最後生成的快照,其實和普通的三方合並的快照內容一模一樣。雖然最後整合得到的結果沒有任何區別,
但是衍合能產生一個更為整潔的提交歷史。如果觀察一個衍合過的分支的歷史記錄,看起來會更清楚:仿佛所有修改都是在一跟線上先後進行的,盡管實際上他們原本是同時並行發生的。
5. 撤銷操作。
回退到上一個版本
reset 用法:
git reset --hard HEAD^
revert 用法:
git revert HEAD
git revert 和 git reset的區別
- git revert是用一次新的commit來回滾之前的commit,git reset是直接刪除指定的commit。
- 在回滾這一操作上看,效果差不多。但是在日後繼續merge以前的老版本時有區別。因為git revert是用一次逆向的commit“中和”之前的提交,因此日後合並老的branch時,導致這部分改變不會再次出現,但是git reset是之間把某些commit在某個branch上刪除,因而和老的branch再次merge時,這些被回滾的commit應該還會被引入。
- git reset 是把HEAD向後移動了一下,而git revert是HEAD繼續前進,只是新的commit的內容和要revert的內容正好相反,能夠抵消要被revert的內容。
丟棄工作區的修改:
我們在已經提交的test.txt文件中添加一句話:
真是愚蠢!
使用 git checkout -- test.txt
撤銷這句話的內容。
撤銷暫存區的修改:
我們在已經提交的test.txt文件中添加一句話:
真是愚蠢!
並將test.txt文件add到暫存區。
使用 git reset HEAD test.txt
將test.txt,重新放回工作區。
6. git標簽管理。
創建標簽:git tag <name>
。
用 git tag
查看所有標簽。
刪除標簽:git tag -d <tagname>
。
7. git fetch 和 push 用法。
fetch是將遠程分支下載下來,但不會進行合並,
push是將本地分支上傳到遠程分支。
這裏只進行fetch的演示,因為遠程的git倉庫我不想修改。
8. Git打補丁。
Git 提供了兩種補丁方案,一是用 git diff
生成的UNIX標準補丁 .diff
文件,二是 git format-patch
生成的 Git 專用 .patch
文件。
.diff
文件只是記錄文件改變的內容,不帶有 commit 記錄信息,多個 commit 可以合並成一個 .diff
文件。
.patch
文件帶有記錄文件改變的內容,也帶有 commit 記錄信息,每個 commit 對應一個 .patch
文件。
a. 創建patch 文件的常用命令行。
某次提交(含)之前的幾次提交:
git format-patch [commit sha1 id]-n //n指從sha1 id對應的commit開始算起n個提交。
某兩次提交之間的所有patch:
git format-patch [commit sha1 id]..[commit sha1 id]
b. 創建diff文件的常用方法。
git diff [commit sha1 id] [commit sha1 id] > [diff文件名]
Git 教程 -- 基於自己學習記錄