【原】《Git教程》學習筆記

1 建立版本庫

1.1 初始化

初始化一個Git倉庫,使用 git init 命令。github

添加文件到Git倉庫,分兩步:安全

  • 第一步,使用命令git add <file> ,注意,可反覆屢次使用,添加多個文件;網絡

  • 第二步,使用命令git commit -m "xxx" ,完成。ssh

1.2 工做區狀態:

  • 要隨時掌握工做區的狀態,使用git status 命令。分佈式

  • 若是git status 告訴你有文件被修改過,用git diff 能夠查看修改內容。fetch

1.3 查看修改內容:

  • 使用git diff <file>命令查看文件的修改內容。

1.4 提交修改(與添加文件相同):

  • 第一步,使用git add <file>,也能夠反覆添加多個修改文件;ui

  • 第二步,使用git commit -m "xxx",完成提交。url

2 時光機穿梭

2.1 版本回退:

  • 進行版本回退以前可使用git log  查看提交歷史。
    • 使用命令git log --pretty=oneline 來顯示簡單的提交歷史信息。
  • Git容許咱們在版本的歷史之間穿梭,使用命令git reset --hard commit_id
    操作系統

    • Git中的commit_id是一個SHA1計算出來的一個很是大的數字,用十六進制表示;

    • 在Git中,用HEAD 表示當前版本; (HEAD表明的是最近的一次commit的信息)

    • 上一版本使用 HEAD^,上上一版本使用HEAD^^,往上100個版本寫成HEAD~100

    • 版本號不必寫全,前幾位就能夠了,Git會自動去找。

  • 要重返 將來,用 git reflog 查看命令歷史,以便肯定要回到將來的哪一個版本。

2.2 撤銷修改:

  • 場景1:當你改亂了工做區某個文件的內容,想直接丟棄工做區的修改時,用命令git checkout -- file

    • 命令git checkout -- readme.txt 意思就是,把readme.txt 文件在工做區的修改所有撤銷,這裏有兩種狀況:

      • 一種是 readme.txt 自修改後尚未被放到暫存區,如今,撤銷修改就回到和版本庫如出一轍的狀態;

      • 一種是 readme.txt 已經添加到暫存區後,又做了修改,如今,撤銷修改就回到添加到暫存區後的狀態。

      • 總之,就是讓這個文件回到最近一次git commitgit add 時的狀態。

    -git reset 命令既能夠回退版本,也能夠把暫存區的修改回退到工做區。當咱們用HEAD 時,表示最新的版本。

  • 場景2:當你不但改亂了工做區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file ,就回到了場景1,第二步按場景1操做。

    • 用命令git reset HEAD file 能夠把暫存區的修改撤銷掉(unstage),從新放回工做區;

    • git reset 命令既能夠回退版本,也能夠把暫存區的修改回退到工做區。當咱們用HEAD 時,表示最新的版本。

  • 場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考 版本回退 一節,不過前提是沒有推送到遠程庫。

2.3 刪除文件:

    命令git rm 用於刪除一個文件。若是一個文件已經被提交到版本庫,那麼你永遠不用擔憂誤刪,可是要當心,你只能恢復文件到最新版本,你會丟失** 最近一次提交後你修改的內容 ** 。

3 遠程倉庫

3.1 添加遠程庫:

  • 要關聯一個遠程庫,使用命令git remote add origin git@server-name:path/repo-name.git

    • 使用命令git remote -v 列出遠程庫列表;

    • 使用命令git remote remove <name> 刪除指定的遠程庫;

  • 關聯後,使用命令git push -u origin master 第一次推送master分支的全部內容;

  • 此後,每次本地提交後,只要有必要,就可使用命令git push origin master 推送最新修改;

  • 分佈式版本系統的最大好處之一是在本地工做徹底不須要考慮遠程庫的存在,也就是有沒有聯網均可以正常工做,而SVN在沒有聯網的時候是拒絕幹活的!當有網絡的時候,再把本地提交推送一下就完成了同步,真是太方便了!

3.2 從遠程倉庫克隆

  • 要克隆一個倉庫,首先必須知道倉庫的地址,而後使用git clone 命令克隆,例: $ git clone git@github.com:michaelliao/gitskills.git

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

4 分支管理

你建立了一個屬於你本身的分支,別人看不到,還繼續在原來的分支上正常工做,而你在本身的分支上幹活,想提交就提交,直到開發完畢後,再一次性合併到原來的分支上,這樣,既安全,又不影響別人工做。

4.1 建立與合併分支

  • 查看分支:git branch

  • 建立分支:git branch <name>

  • 切換分支:git checkout <name>

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

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

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

4.2 衝突處理

  • 當Git沒法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。

  • 用 git log --graph 命令能夠看到分支合併圖。

4.3 分支管理策略

在實際開發中,咱們應該按照幾個基本原則進行分支管理:

首先, master 分支應該是很是穩定的,也就是僅用來發布新版本,平時不能在上面幹活;

那在哪幹活呢?幹活都在 dev 分支上,也就是說, dev 分支是不穩定的,到某個時候,好比1.0版本發佈時,再把 dev 分支合併到 master 上,在 master 分支發佈1.0版本;

你和你的小夥伴們每一個人都在 dev 分支上幹活,每一個人都有本身的分支,時不時地往 dev 分支上合併就能夠了。

因此,團隊合做的分支看起來就像這樣:

** 合併分支時,加上--no-ff 參數就能夠用普通模式合併,合併後的歷史有分支,能看出來曾經作過合併,而fast forward 合併就看不出來曾經作過合併 **。

4.4 Bug分支

+ 修復bug時,咱們會經過建立新的bug分支進行修復,而後合併,最後刪除;

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

4.5 Feature分支

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

  • 若是要丟棄一個沒有被合併過的分支,能夠經過 git branch -D 強行刪除。

4.6 多人協做

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

  1. 首先,能夠試圖用git push origin branch-name 推送本身的修改;

  2. 若是推送失敗,則由於遠程分支比你的本地更新,須要先用git pull 試圖合併;

  3. 若是合併有衝突,則解決衝突,並在本地提交;

  4. 沒有衝突或者解決掉衝突後,再用git push origin branch-name 推送就能成功!

若是git pull 提示「no tracking information」,則說明本地分支和遠程分支的連接關係沒有建立,用命令git branch --set-upstream branch-name origin/branch-name

這就是多人協做的工做模式,一旦熟悉了,就很是簡單。

git branch --set-upstream branch-name origin/branch-name如今已經改成git branch --set-upstream-to=origin/branch-name

** 總結: **

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

  • 本地新建的分支若是不推送到遠程,對其餘人就是不可見的;

  • 從本地推送分支,使用git push origin branch-name ,若是推送失敗,先用git pull 抓取遠程的新提交;

  • 在本地建立和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name ,** 本地和遠程分支的名稱最好一致 **;

  • 創建本地分支和遠程分支的關聯,使用git branch --set-upstream-to=origin/branch-name

  • 從遠程抓取分支,使用git pull ,若是有衝突,要先處理衝突。

5 標籤管理

5.1 建立標籤

  • 命令git tag <name> 用於新建一個標籤,默認爲HEAD ,也能夠指定一個commit id

  • git tag -a <tagname> -m "blablabla..." 能夠指定標籤信息;

  • git tag -s <tagname> -m "blablabla..." 能夠用PGP簽名標籤;

  • 命令git tag 能夠查看全部標籤。

5.2 操做標籤

  • 命令git push origin <tagname> 能夠推送一個本地標籤;

  • 命令git push origin --tags 能夠推送所有未推送過的本地標籤;

  • 命令git tag -d <tagname> 能夠刪除一個本地標籤;

  • 命令git push origin :refs/tags/<tagname> 能夠刪除一個遠程標籤。

6 使用GitHub

  • 在GitHub上,能夠任意Fork開源倉庫;

  • 本身擁有Fork後的倉庫的讀寫權限;

  • 能夠推送pull request給官方倉庫來貢獻代碼。

7 自定義Git

讓Git顯示顏色,會讓命令輸出看起來更醒目:

$

git config --global color.ui
true

7.1 忽略特殊文件

  • 在Git工做區的根目錄下建立一個特殊的 .gitignore 文件,而後把要忽略的文件名填進去,Git就會自動忽略這些文件。

  • 不須要從頭寫 .gitignore 文件,GitHub已經爲咱們準備了各類配置文件,只須要組合一下就可使用了。全部配置文件能夠直接在線瀏覽:( https://github.com/github/gitignore )

** 忽略文件的原則是: **

  1. 忽略操做系統自動生成的文件,好比縮略圖等;

  2. 忽略編譯生成的中間文件、可執行文件等,也就是若是一個文件是經過另外一個文件自動生成的,那自動生成的文件就不必放進版本庫,好比Java編譯產生的 .class 文件; 3. 忽略你本身的帶有敏感信息的配置文件,好比存放口令的配置文件。

** 小結: **

  • 忽略某些文件時,須要編寫.gitignore

  • .gitignore 文件自己要放到版本庫裏,而且能夠對.gitignore 作版本管理!

一個完整的.gitignore文件的例子:
# Windows:

Thumbs

.db
ehthumbs.db
Desktop.ini

# Python:

*.py[cod]
*.so
*.egg
*.egg-info
dist
build



# My configurations:

db.ini
deploy_key_rsa

7.2 配置別名

可使用st表示status, co 表示 checkout , ci 表示 commit , br 表示 branch :

$

git config --global
alias
.st status
$
git config --global
alias
.co checkout
$
git config --global
alias
.ci commit
$
git config --global
alias
.br branch

之後提交就能夠簡寫成:

$

git ci -m
"bala bala bala..."

--global 參數是全局參數,也就是這些命令在這臺電腦的全部Git倉庫下都有用。

配置Git的時候,加上--global 是針對當前用戶起做用的,若是不加,那隻針對當前的倉庫起做用。

配置文件放哪了?每一個倉庫的Git配置文件都放在.git/config 文件中:

$

cat .git/config
[core]
repositoryformatversion =
0

filemode =

true

bare =

false

logallrefupdates =

true

ignorecase =

true

precomposeunicode =

true
[remote
"origin"]
url = git
@github
.
com:
michaelliao/learngit.git
fetch = +refs/heads/
:refs/remotes/origin/

[branch
"master"]
remote = origin
merge = refs/heads/master
[
alias]
last = log -
1

別名就在 [alias] 後面,要刪除別名,直接把對應的行刪掉便可。

而當前用戶的Git配置文件放在用戶主目錄下的一個隱藏文件.gitconfig 中:

$

cat .gitconfig
[
alias]
co = checkout
ci = commit
br = branch
st = status
[user]
name =
Your

Name

email = your

@email .com

相關文章
相關標籤/搜索