目錄git
初始化一個Git倉庫,使用 git init 命令。github
添加文件到Git倉庫,分兩步:安全
第一步,使用命令git add <file>
,注意,可反覆屢次使用,添加多個文件;網絡
第二步,使用命令git commit -m "xxx"
,完成。ssh
要隨時掌握工做區的狀態,使用git status
命令。分佈式
若是git status
告訴你有文件被修改過,用git diff
能夠查看修改內容。fetch
git diff <file>
命令查看文件的修改內容。第一步,使用git add <file>
,也能夠反覆添加多個修改文件;ui
第二步,使用git commit -m "xxx"
,完成提交。url
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 查看命令歷史,以便肯定要回到將來的哪一個版本。
場景1:當你改亂了工做區某個文件的內容,想直接丟棄工做區的修改時,用命令git checkout -- file
。
命令git checkout -- readme.txt
意思就是,把readme.txt
文件在工做區的修改所有撤銷,這裏有兩種狀況:
一種是 readme.txt 自修改後尚未被放到暫存區,如今,撤銷修改就回到和版本庫如出一轍的狀態;
一種是 readme.txt 已經添加到暫存區後,又做了修改,如今,撤銷修改就回到添加到暫存區後的狀態。
總之,就是讓這個文件回到最近一次git commit
或git add
時的狀態。
-git reset
命令既能夠回退版本,也能夠把暫存區的修改回退到工做區。當咱們用HEAD
時,表示最新的版本。
場景2:當你不但改亂了工做區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file
,就回到了場景1,第二步按場景1操做。
用命令git reset HEAD file
能夠把暫存區的修改撤銷掉(unstage),從新放回工做區;
git reset
命令既能夠回退版本,也能夠把暫存區的修改回退到工做區。當咱們用HEAD
時,表示最新的版本。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考 版本回退 一節,不過前提是沒有推送到遠程庫。
命令git rm
用於刪除一個文件。若是一個文件已經被提交到版本庫,那麼你永遠不用擔憂誤刪,可是要當心,你只能恢復文件到最新版本,你會丟失** 最近一次提交後你修改的內容 ** 。
要關聯一個遠程庫,使用命令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在沒有聯網的時候是拒絕幹活的!當有網絡的時候,再把本地提交推送一下就完成了同步,真是太方便了!
要克隆一個倉庫,首先必須知道倉庫的地址,而後使用git clone
命令克隆,例: $ git clone git@github.com:michaelliao/gitskills.git
。
Git支持多種協議,包括 https ,但經過 ssh 支持的原生 git 協議速度最快。
你建立了一個屬於你本身的分支,別人看不到,還繼續在原來的分支上正常工做,而你在本身的分支上幹活,想提交就提交,直到開發完畢後,再一次性合併到原來的分支上,這樣,既安全,又不影響別人工做。
查看分支:git branch
建立分支:git branch <name>
切換分支:git checkout <name>
建立+切換分支:git checkout -b <name>
合併某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
當Git沒法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。
用 git log --graph 命令能夠看到分支合併圖。
在實際開發中,咱們應該按照幾個基本原則進行分支管理:
首先, master 分支應該是很是穩定的,也就是僅用來發布新版本,平時不能在上面幹活;
那在哪幹活呢?幹活都在 dev 分支上,也就是說, dev 分支是不穩定的,到某個時候,好比1.0版本發佈時,再把 dev 分支合併到 master 上,在 master 分支發佈1.0版本;
你和你的小夥伴們每一個人都在 dev 分支上幹活,每一個人都有本身的分支,時不時地往 dev 分支上合併就能夠了。
因此,團隊合做的分支看起來就像這樣:
** 合併分支時,加上
--no-ff
參數就能夠用普通模式合併,合併後的歷史有分支,能看出來曾經作過合併,而fast forward
合併就看不出來曾經作過合併 **。
+ 修復bug時,咱們會經過建立新的bug分支進行修復,而後合併,最後刪除;
git stash
一下,而後去修復bug,修復後,再git stash pop
,回到工做現場。開發一個新feature,最好新建一個分支;
若是要丟棄一個沒有被合併過的分支,能夠經過 git branch -D
多人協做的工做模式一般是這樣:
首先,能夠試圖用git push origin branch-name
推送本身的修改;
若是推送失敗,則由於遠程分支比你的本地更新,須要先用git pull
試圖合併;
若是合併有衝突,則解決衝突,並在本地提交;
沒有衝突或者解決掉衝突後,再用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
,若是有衝突,要先處理衝突。
命令git tag <name>
用於新建一個標籤,默認爲HEAD
,也能夠指定一個commit id
;
git tag -a <tagname> -m "blablabla..."
能夠指定標籤信息;
git tag -s <tagname> -m "blablabla..."
能夠用PGP簽名標籤;
命令git tag
能夠查看全部標籤。
命令git push origin <tagname>
能夠推送一個本地標籤;
命令git push origin --tags
能夠推送所有未推送過的本地標籤;
命令git tag -d <tagname>
能夠刪除一個本地標籤;
命令git push origin :refs/tags/<tagname>
能夠刪除一個遠程標籤。
在GitHub上,能夠任意Fork開源倉庫;
本身擁有Fork後的倉庫的讀寫權限;
能夠推送pull request給官方倉庫來貢獻代碼。
讓Git顯示顏色,會讓命令輸出看起來更醒目:
$
git config --global color.ui
true
在Git工做區的根目錄下建立一個特殊的 .gitignore 文件,而後把要忽略的文件名填進去,Git就會自動忽略這些文件。
不須要從頭寫 .gitignore 文件,GitHub已經爲咱們準備了各類配置文件,只須要組合一下就可使用了。全部配置文件能夠直接在線瀏覽:( https://github.com/github/gitignore )
** 忽略文件的原則是: **
忽略操做系統自動生成的文件,好比縮略圖等;
忽略編譯生成的中間文件、可執行文件等,也就是若是一個文件是經過另外一個文件自動生成的,那自動生成的文件就不必放進版本庫,好比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
可使用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