git關鍵套路及實用命令

前言

  lucifer先後在兩間企業進行嵌入式軟件方面的開發和維護,他們軟件的版本控制都是用svn,每次關鍵時刻你想查看某份軟件的更新日記時,打開log的加載速度實在不敢恭維。後來打聽幾位就業於其他企業的同學用的版本控制軟件時,做android或裸框架的linux項目軟件的版本維護均爲git,然後我就參考廖雪峯的git教程(網址在本文末)產出此篇學習筆記。

第一章 git安裝和創建版本庫

1. 安裝git

  • 從網絡下載和安裝sudo apt-get install git

  • 設置將來所有倉庫的個人信息

$ git config --global user.name "name"
$ git config --global user.email "[email protected]"

2. 創建版本庫

  • 初始化當前目錄作爲倉庫:git init

  • 指定文件納入倉庫的管理

$ git add <file>
$ git commit -m "xxx"
  • 移除git對文件的版本管控:git rm <file>
加入暫存區操作的擴展:
暫存所有變化:git add -A
暫存修改(modified)和被刪除(deleted)文件,不包括新文件(new):git add -u
暫存新文件(new)和被修改(modified)文件,不包括被刪除(deleted)文件:git add .

第二章 時光機穿梭

  • 查看倉庫狀態git status

  • 查看文件差異的內容:git diff <HEAD -- file>(忽略文件權限差異:git config core.filemode false

  • 查看提交的記錄git log <--pretty=oneline>

  • 查看被管控的文件git ls-files

  • 相對當前版本進行回退git reset --hard HEAD^

    注:“^”的個數表示向後回退版本的個數

  • 切換到任意版本git reset --hard <commit-id>

  • 查看版本變更歷史git reflog

重要概念:工作區,版本庫=暫存區+分支
理解Git是如何跟蹤修改的,每次修改,如果不add到暫存區,那就不會加入到commit中。

撤銷文件的更改:
暫存區中的修改內容回退到工作區:git reset HEAD <file>
② 丟棄工作區的修改(實爲覆蓋目標文件):git checkout -- <file>;丟棄所有:git checkout .(除新增文件外)
生成補丁和打補丁:
目標版本工程文件夾內生成補丁:git diff <老版本commit-id> <新版本commit-id> > xxx.patch;若兩個版本間差異存在二進制文件,如添加了bmp圖片時,git diff <old-id> <new-id> --binary > xxx.patch
老版本工程文件夾內打補丁:git apply xxx.patch

第三章 遠程倉庫

將github作爲遠程庫:
① 創建SSH key:ssh-keygen -t rsa -C "[email protected]"
② 登錄github,點“Add SSH Key”,填上任意Title,在Key文本框裏粘貼id_rsa.pub文件的內容.

1. 添加遠程庫

  • 將本地庫關聯遠程倉庫:
$ git remote add origin git@github.com:<用戶名>/<倉庫名>.git
                    |                             |
                本地庫給遠程庫起名          在github上創建時填的倉庫名
  • 刪除與遠程庫的關聯:git remote rm origin

  • 第一次往遠程庫推送

$ git push -u origin master
                        |
                    本地庫主分支默認名
  • 後續推送更新到遠程庫:git push origin <branch>

2. 從遠程庫克隆到本地

項目從零開始時:
① 創建遠程庫;
② 克隆到本地:git clone <addr>

ssh協議克隆github的倉庫:

$ git clone git@github.com:<用戶名>/<倉庫名>.git

Git支持多種協議,包括https,但通過ssh支持的原生git協議速度最快。

第四章 分支管理

1. 創建與合併分支:

  • 查看分支:git branch

  • 創建分支:git branch <name>

  • 切換分支:git checkout <name>

  • 創建+切換分支:git checkout -b <name>

  • 合併某分支到當前分支:git merge <name>

  • 刪除分支:git branch -d <name>

注:HEAD指向的是當前分支,master是主分支的默認名

2. 解決分支衝突

  不同分支修改同一位置時,“快速合併”會產生衝突,在衝突位置會有指示。解決衝突後,再提交,合併完成。
顯示分支合併圖

$ git log --graph --pretty=oneline --abbrev-commit
                            |             |
                          簡化顯示   commit的SHA1只顯示7位

3. 分支管理策略

a. 禁用Fast forward合併分支

  • git merge <name>會用fast forward模式,刪除分支後,會丟掉分支信息。

  • 強制禁用Fast forward模式,git就會在merge時生成一個新的commit分支歷史上可以看出分支信息

  • 禁用fast forward模式的合併

$ git merge --no-ff -m "xxx" <brach name>

b. 分支管理

  • master分支應該是非常穩定的,僅用來發布新版本,平時不能在上面幹活;

  • 一般在dev分支幹活,dev分支是不穩定的,到某個時候,比如1.0版本發佈時,再把dev分支合併到master上,在master分支發佈1.0版本;

  • 每個人都在dev分支上幹活,每個人都有自己的分支,特定時候再往dev分支合併自己的更新。

4. bug分支

  ① 修復bug時,創建新的bug分支進行修復,然後合併,最後刪除;

  ②保存工作現場(未commit的更改):

$ git stash

  ③查看已經保存的工作現場

$ git stash list

  ④恢復工作現場
   第一種 先恢復,再刪掉:

$ git stash apply stash@{n}
$ git stash drop stash@{n}

  第二種 恢復+刪除:

$ git stash pop

5. 強行刪除分支

  • 開發一個新feature,最好新建一個分支;

  • 丟棄一個沒有被合併過的分支,強行刪除:

$ git branch -D <name>

6. 多人協作

a. 推送分支

$ git push origin <branch-name>

  master分支:主分支,時刻與遠程同步;
  dev分支:開發分支,團隊所有成員都需要在上面工作,也需要與遠程同步;
  bug分支:只用於在本地修復bug,就沒必要推到遠程了,除非老闆要看看你每週到底修復了幾個bug;
  feature分支:是否推到遠程,取決於你是否和你的小夥伴合作在上面開發。

b. 抓取分支

  ① 從遠程庫克隆下來;
  ② 在本地只能看到master分支,需在遠程庫的其它分支工作時,創建遠程origin/dev分支到本地:

$ git checkout -b <branch> origin/<branch>

  ③提交更新給本地庫,推送到遠程庫。

c. 合併遠程庫的更新到本地

  • 查看遠程庫信息git remote -v

  • 建立本地分支和遠程分支的關聯git branch --set-upstream <branch-name> origin/<branch-name>

  • 合併遠程庫關聯的分支下來git pull origin <branch-name>

    注:如果合併有衝突,則解決衝突,並在本地提交;再推送成功。

第五章 標籤管理

1. 創建標籤

  • 查看所有標籤git tag

  • 給HEAD貼標籤:git tag <tagname>

  • 對特定commit id貼標籤,並附帶信息git tag -a <tagname> -m "xxx..." <commit-id>

  • 用PGP簽名貼標籤:git tag -s <tagname> -m "xxx..." <commit-id>

  • 通過標籤看commit內容git show <tagname>

2. 操作標籤

  • 推送本地標籤到遠程庫:git push origin <tagname>

  • 推送所有標籤git push origin --tags

  • 刪除本地標籤:git tag -d <tagname>

  • 刪除遠程庫的標籤:①先刪除本地標籤;② git push origin :refs/tags/<tagname>

第六章 使用gitHub

  • 山寨別人的倉庫到自己用戶裏Fork

  • 給作者發送修改請求:New pull request
    Fork和New pull request

第七章 自定義git

  • 配置git交互的內容具有顏色
$ git config --global color.ui true

1. 忽略特殊文件

  ① 在Git工作區的根目錄下創建一個特殊的.gitignore文件,然後把要忽略的文件名填進去,Git就會自動忽略這些文件。現成的配置文件https://github.com/github/gitignore
  ② 把.gitignore文件也提交到git。

注:強制添加一個已經寫入配置文件的文件:git add -f <file-name>

2. 搭建git服務器

參考文獻

  廖雪峯的git教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章