Git 學習筆記

最近公司的代碼管理工具要從SVN轉到Git上,所以雖然以前用過Git,可是都是一些簡單的推送提交,所以仍是有必要進行一些系統的學習,這裏作一下筆記,以備後詢,且不按期更新。css

關於SVN和Git的比較已經有不少文章說過了,就再也不贅述,本文的重點是如何使用經常使用的Git命令進行操做,冷門的就不說了,且比較零散,系統的學習推介廖雪峯的Git教程html

聲明前端

  1. 下面用戶名都爲SHERlocked93,請自行修改爲本身的用戶名

1. 概覽

  • 工做區 Workspace
  • 暫存區 Stage / Index
  • 本地倉庫 Repository
  • 遠程倉庫 Remote

2. 修改

2.1 暫存修改

操做一覽git

操做 bash
建立stash git stash
查看 git stash list
應用 git stash apply stash@{<num>}
刪除 git stash drop stash@{<num>}
還原上一個暫存並刪除暫存(如無conflict) git stash pop

若是在工做的時候出現了臨時須要解決的問題,而你又不但願提交,那麼有個stash功能github

git stash

在暫存後工做區會回退到最近的一個commit的狀態,以便開建新分支;好比咱們修復bug時,咱們會經過建立新的bug分支進行修復,而後合併,最後刪除;安全

當手頭工做沒有完成時,先把工做現場git stash一下,而後去修復bug,修復後,再git stash pop,回到工做現場。bash

2.2 撤銷修改

還未提交到暫存區

當修改尚未被add的時候,可使用微信

git checkout -- filename.txt

來丟棄工做區某文件的修改,固然也能夠把後面的文件改爲*來撤銷全部文件的修改。這是用倉庫的文件覆蓋工做區的文件。app

注意這裏用的是--,若是沒有這個--的話就變成切換分支了。工具

還未提交到倉庫

若是你的修改已經被add到了暫存區,可是尚未被commit,那麼可使用

git reset HEAD filename.txt
git checkout -- filename.txt

首先用reset來把修改撤回到工做區,再使用上面的checkout命令撤回工做區的修改。這裏的reset至關於add的反操做。

已經提交到倉庫

則能夠版本回退

git reset --hard 15zdx2s

這裏的--hard表示強制回退,丟棄本地的修改。這個回退比較野蠻,該版本號以後的提交都將不可見。

撤銷以前某一個提交

git revert撤銷一個提交的同時會建立一個新的提交,這是一個安全的方法,由於它不會重寫提交歷史。但實現上和reset是徹底不一樣的。它撤銷這個提交引入的更改,而後在最後加上一個撤銷了更改的新提交,而不是從項目歷史中移除這個提交。

git revert 46af7z6

相較於resetrevert不會改變項目歷史,對那些已經發布到共享倉庫的提交來講這是一個安全的操做。其次git revert 能夠將提交歷史中的任何一個提交撤銷、而reset會把歷史上某個提交及以後全部的提交都移除掉,這太野蠻了。

相比 reset,它不會改變如今的提交歷史。所以,revert 能夠用在公共分支上,reset 應該用在私有分支上。

合併commit

若是已經commit了怎麼辦,若是要撤回目前的commit,能夠把它合併到上一個commit

git rebase -i HEAD~~

在出現的兩個提交信息的pick改成fixup

3. 分支操做

3.1 建立/查看/合併分支

操做一覽

操做 bash
查看分支 git branch
查看本地和遠程分支 git branch -a
在target分支上建立分支,沒有則從當前分支 git branch <branch-name> <target-branch>
建立並切換分支 git checkout -b <branch-name>
合併某分支到當前分支 git merge <branch-name>
刪除分支,只能刪參與了合併的 git branch -d <branch-name>
強行刪除 git branch -D <branch-name>
刪除遠程分支 git push origin :<remote-branch-name>

建立分支

# 建立新分支
git branch bug-fix
# 查看分支,-a查看本地和遠程的分支,-r查看遠程分支,-l或沒有隻查看本地
git branch -a
# 切換到剛剛建立的分支
git checkout bug-fix

上面兩個步驟能夠合併爲

# 建立並切換到分支
git checkout -b bug-fix

若是修改一下本地文件以後在這個分支繼續培育一個版本以後,怎麼去合併到主分支呢

git add *
git commit -m "some change"
# 切換到主分支
git checkout master
# 合併分支
git merge bug-fix
# 刪除分支 (可選)
git branch -d bug-fix

若是master分支和新的分支都各自培育了版本,那麼自動合併一般會失敗,發生衝突conflict,此時須要打開文件解決衝突以後commit一個版本以完成合並

git add *
git commit -m "branch merge"

這裏提一下,merge的時候有幾個主要模式,--no-fffast-forward,其中fast-forward是默認的

  1. fast-forward:在master開始的新分支前進了幾個版本以後若是須要merge回來,此時master並無前進,那麼這個模式就是把HEAD與master指針指向新分支上,完成合並。這種狀況若是刪除分支,則會丟失分支信息,由於在這個過程當中並無建立commit。
  2. --no-ff:關閉默認的fast-forward模式,也就是在merge的時候生成一個新的commit,這樣在分支歷史上就能夠看出分支信息。

3.2 遠程倉庫操做

操做一覽

操做 bash
克隆 git clone <url>
添加遠程倉庫 git remote add <name> <url>
刪除遠程倉庫 git remote rm <name>
拉取 git pull <remote-branch-name> <local-branch-name>
推送本地全部分支到遠程 git push --all origin
推送到遠程同名分支 git push origin <local-branch-name>
推送本地分支到遠程master git push origin <local-branch-name>:master
把當前本地分支推送並建立到遠程 git push origin
檢出遠程分支 git checkout -b <new-local-branch-name> origin/<remote-branch-name>

關於各個分支,哪些須要推送呢

  1. master分支是主分支,所以要時刻與遠程同步;
  2. dev分支是開發分支,團隊全部成員都須要在上面工做,因此也須要與遠程同步;
  3. bug分支只用於在本地修復bug,就不必推到遠程了,除非老闆要看看你每週到底修復了幾個bug;
  4. feature分支是否推到遠程,取決於你是否和你的小夥伴合做在上面開發。

直接clone

在github上建立一個新的項目以後,好比叫learn-git,那麼能夠直接clone下來,注意建立的時候不要選擇 Initialize this repository with a README,咱們要的是一個空的倉庫

git clone https://github.com/SHERlocked93/learn-git.git

這樣在本地就直接建立了一個空的文件夾learn-git,固然裏面有.git文件夾。
也可使用SSH地址來clone,速度會快一些,也不用每次推送都輸入口令,推介使用這種

git clone git@github.com:SHERlocked93/learn-git.git

添加一個文件filename.txt以後

git add filename.txt
git commit -m "add filename.txt"
git push -u origin master

這樣就把本地新建的文件push到了遠程倉庫

本地與遠程創建關聯

若是已經有了本地工程文件夾,如何分享到github遠程倉庫呢,固然此時咱們已經在github上建立了一個新的空白項目,仍是叫learn-git,在本地文件夾中

git init
# 關聯遠程庫
git remote add origin git@github.com:SHERlocked93/learn-git.git
git push -u origin master

就能夠了,若是你的遠程倉庫已經有了提交,那麼在push以前須要

# 容許不想幹庫合併
git pull origin master --allow-unrelated-histories
git push -u origin master

先拉取遠程分支,注意這裏--allow-unrelated-histories容許兩個不想幹的分支強行合併,再push;這樣在github的網站上還能看到commit記錄。

也能夠強硬一點直接強行推送

# -f 強行推送
git push -u origin master -f

這樣本地倉庫就直接把遠程倉庫覆蓋了,且github上也看不到歷史commit了,若是不想被同事槍擊的話,仍是推介上一種作法。

同步遠程倉庫

那麼已經clone的倉庫若是但願同步原倉庫新的提交怎麼辦

# 從遠程分支拉取代碼到本地
git pull upstream master
# push到本身的庫裏
git push  origin master

3.3 多人協做

多人協做的工做模式一般是這樣:

  1. 首先,能夠試圖用git push origin <branch-name>推送本身的修改;
  2. 若是推送失敗,則由於遠程分支比你的本地更新,須要先用git pull試圖合併;
  3. 若是合併有衝突,則解決衝突,並在本地提交;
  4. 沒有衝突或者解決掉衝突後,再用git push origin <branch-name>推送就能成功

從遠程抓取分支,使用git pull,若是有衝突,要先處理衝突,add->commit->push。若是git pull提示no tracking information,則說明本地分支和遠程分支的連接關係沒有建立,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>

4. 標籤操做

操做一覽

操做 bash
查看全部標籤 git tag
新建標籤 git tag <tagname>
新建並制定說明 git tag <tagname> -m <message> <bash>
查看標籤說明 git show <tagname>
刪除標籤 git tag -d <tagname>
推送某個標籤到遠程 git push origin <tagname>
推送全部未推送到遠程的本地標籤 git push origin --tags
合併遠程倉庫的標籤到本地 git pull origin --tags
刪除遠程標籤 git push origin :refs/tags/<tagname>

若是要刪除遠程分支,須要

# 首先刪除本地tag,假如tag是v0.9
git tag -d v0.9
# 再從遠程刪除
git push origin :refs/tags/v0.9

5. 提交格式

type:

  • feat: 新特性,添加功能
  • fix: 修改bug
  • refactor: 代碼重構
  • docs: 文檔修改
  • style: 代碼格式修改, 注意不是 css 修改
  • test: 測試用例修改
  • chore: 其餘修改, 好比構建流程, 依賴管理.

網上的帖子大多深淺不一,甚至有些先後矛盾,在下的文章都是學習過程當中的總結,若是發現錯誤,歡迎留言指出~

推介閱讀:

  1. 廖雪峯 - Git教程
  2. github實現本地倉庫與遠程倉庫同步
  3. 圖解 Git 命令
  4. git基本操做,一篇文章就夠了!
  5. 團隊協做中的 Github flow 工做流程
  6. git 命令大全

附件

  1. Git經常使用命令速查表:

PS:歡迎你們關注個人公衆號【前端下午茶】,一塊兒加油吧~

另外能夠加入「前端下午茶交流羣」微信羣,長按識別下面二維碼便可加我好友,備註加羣,我拉你入羣~

相關文章
相關標籤/搜索