分布式版本控制系統(tǒng)除了Git以及促使Git誕生的BitKeeper外,還有類似Git的Mercurial和Bazaar等眷细。這些分布式版本控制系統(tǒng)各有特點(diǎn)立轧,但最快、最簡(jiǎn)單也最流行的依然是Git草姻!
git config:配置相關(guān)信息
git clone:復(fù)制倉庫
git init:初始化倉庫
git add <name>:添加更新內(nèi)容到索引中
git add -u:將文件的修改钓猬、文件的刪除,添加到暫存區(qū)撩独。
git add .:將文件的修改敞曹,文件的新建,添加到暫存區(qū)综膀。
git add -A:將文件的修改澳迫,文件的刪除,文件的新建僧须,添加到暫存區(qū)纲刀。
git diff:比較內(nèi)容
git status:獲取當(dāng)前項(xiàng)目狀況
git commit:提交
git branch:查看分支
git branch <name>:創(chuàng)建分支
git checkout <name>:切換分支
git checkout -b <name>:創(chuàng)建+切換分支
git merge <name>:合并分支到當(dāng)前分支
git branch -d <name>:刪除分支
git reset:恢復(fù)版本
git log:查看日志
-
工作區(qū)和暫存區(qū)和分支
- 創(chuàng)建版本庫
- Linux文件命令: touch新建 cat查看 rm刪除
- 創(chuàng)建文件夾:
mkdir 文件夾名
- 顯示當(dāng)前目錄:
pwd
- 把當(dāng)前目錄變成Git可以管理的倉庫:
git init
担平,會(huì)多一個(gè).git的目錄示绊,這個(gè)目錄是Git來跟蹤管理版本庫的 - 注意:Word、圖片暂论、視頻無法跟蹤詳細(xì)的內(nèi)容改動(dòng)面褐,強(qiáng)烈建議統(tǒng)一使用標(biāo)準(zhǔn)的UTF-8編碼
- 把一個(gè)文件放到Git倉庫:
$ git add readme.txt
$ git commit -m "wrote a readme file"
-m后面輸入的是本次提交的說明
- 時(shí)光機(jī)穿梭
- 掌握倉庫當(dāng)前的狀態(tài):
git status
總是有個(gè)奇怪的.DS_Store文件 解決辦法 - 查看具體修改的內(nèi)容:
git diff xx文件
- 版本回退:
git log
顯示從最近到最遠(yuǎn)的提交日志
git reset --hard HEAD^
回退到上一個(gè)版本
git reset --hard commit_id
回退到某個(gè)具體版本 - 恢復(fù)到新版本:退回到過去后git log 現(xiàn)在已經(jīng)看不到最新的版本了
用git reflog
可以查看每一次命令再用git reset
又可以回到未來了 - 撤銷修改:
把暫存區(qū)的修改撤銷(unstage):git reset HEAD file
把工作區(qū)的修改撤銷:讓這個(gè)文件回到最近一次git commit或git add時(shí)的狀態(tài):$ git checkout -- file
沒有--,就變成了“切換到另一個(gè)分支”的命令 - 刪除文件:刪除后取胎,
git rm file
然后commit展哭,刪錯(cuò)了要恢復(fù)可以$ git checkout -- file
- 掌握倉庫當(dāng)前的狀態(tài):
- 遠(yuǎn)程倉庫
需要兩臺(tái)機(jī)器才能玩遠(yuǎn)程庫,可以利用GitHub提供的Git倉庫托管服務(wù)闻蛀,不過免費(fèi)的是公開的匪傍。- 創(chuàng)建SSH Key并在GitHub關(guān)聯(lián)pubkey:
$ ssh-keygen -t rsa -C "youremail@example.com"
私鑰存在 /Users/用戶名/.ssh/id_rsa
公鑰存在 /Users/用戶名/.ssh/id_rsa.pub - 添加遠(yuǎn)程庫:
第一次推送本地master分支的所有內(nèi)容到GitHub,先在Github上新建庫觉痛,然后在本地庫位置命令行輸入
$ git remote add origin git@github.com:Moumilang/learngit.git
$ git push -u origin master
origin是約定俗成的名字役衡,一看就知道是遠(yuǎn)端,在本地的./git/config中有相應(yīng)設(shè)置薪棒。加上了-u參數(shù)手蝎,Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支榕莺,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來,在以后的推送或者拉取時(shí)就可以簡(jiǎn)化命令棵介。
用https和ssh的區(qū)別 - 把本地master分支的最新修改推送至GitHub:
$ git push origin master
- 從遠(yuǎn)程庫克露ぱ臁:
先在Github上新建庫,勾選Initialize this repository with a README
在本地文件夾位置命令行輸入
$ git clone git@github.com:Moumilang/gitskills.git
- 創(chuàng)建SSH Key并在GitHub關(guān)聯(lián)pubkey:
- 分支管理
創(chuàng)建一個(gè)屬于你自己的分支邮辽,別人看不到唠雕,還繼續(xù)在原來的分支上正常工作,而你在自己的分支上干活逆巍,想提交就提交及塘,直到開發(fā)完畢后,再一次性合并到原來的分支上锐极,這樣笙僚,既安全,又不影響別人工作灵再。-
創(chuàng)建與合并分支
創(chuàng)建dev分支肋层,然后切換到dev分支:
$ git checkout -b dev
相當(dāng)于
$ git branch dev
$ git checkout dev
查看當(dāng)前分支:$ git branch
合并指定分支到當(dāng)前分支:$ git merge dev
刪除分支:$ git branch -d dev
-
解決沖突:
both modified這種情況下,Git無法執(zhí)行“快速合并”,必須手動(dòng)解決沖突后再提交翎迁。最后刪除不要的分支栋猖。
查看分支合并圖可用:git log --graph
禁用快速合并:會(huì)創(chuàng)建一個(gè)新的提交,合并后的歷史有分支汪榔,能看出來曾經(jīng)做過合并蒲拉。
$ git merge --no-ff -m "merge with no-ff" dev
-
分支管理策略
master分支應(yīng)該是非常穩(wěn)定的,也就是僅用來發(fā)布新版本痴腌,平時(shí)不能在上面干活
bug分支
當(dāng)手頭工作沒有完成時(shí)雌团,先把工作現(xiàn)場(chǎng)git stash一下,然后去修復(fù)bug士聪,修復(fù)后锦援,再git stash pop,回到工作現(xiàn)場(chǎng):
首先暫時(shí)儲(chǔ)存當(dāng)前分支dev工作但不提交:$ git stash
然后在某分支比如master上創(chuàng)建bug臨時(shí)分支如issue-101
修復(fù)完成后提交剥悟,切換到master后合并bug分支
回到dev分支工作:查看工作現(xiàn)場(chǎng)位置$ git stash list
灵寺,恢復(fù)stash內(nèi)容并不刪除:git stash apply stash@{0}
;恢復(fù)同時(shí)把stash內(nèi)容也刪了:git stash pop
feature分支
開發(fā)一個(gè)新feature区岗,最好新建一個(gè)分支略板,完成后切回分支合并刪除;
如果要丟棄一個(gè)沒有被合并過的分支,可以通過git branch -D <name>強(qiáng)行刪除。多人協(xié)作
查看遠(yuǎn)程庫git remote -v
推送分支$ git push 遠(yuǎn)程庫名 分支名
抓取分支:別人從遠(yuǎn)程庫clone下來后只有master分支棵红,執(zhí)行$ git pull $ git checkout -b dev origin/dev
前提是遠(yuǎn)程倉庫已經(jīng)有dev了
多人協(xié)作的工作模式通常是這樣:
-
首先,可以試圖用git push origin branch-name推送自己的修改颅拦;
如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新教藻,需要先用git pull試圖合并距帅;
如果合并有沖突,則解決沖突括堤,并在本地提交碌秸;
沒有沖突或者解決掉沖突后,再用git push origin branch-name推送就能成功悄窃!
如果git pull提示“no tracking information”讥电,則說明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒有創(chuàng)建,用命令git branch --set-upstream branch-name origin/branch-name轧抗。
- 標(biāo)簽管理
tag就是一個(gè)讓人容易記住的有意義的名字恩敌,它跟某個(gè)commit綁在一起。- 切換到需要打標(biāo)簽的分支然后:
git tag v1.0
- 查看標(biāo)簽和信息:
git tag
git show tagname
- 查找歷史提交的commit id:
$ git log --pretty=oneline --abbrev-commit
- 對(duì)以前的commit版本打標(biāo)簽:
$ git tag v0.9 版本號(hào)
- 指定標(biāo)簽信息:
$ git tag -a v0.1 -m "version 0.1 released" 3628164
- 用PGP簽名標(biāo)簽:
$ git tag -s v0.1 -m "version 0.1 released" 3628164
- 刪除標(biāo)簽:
$ git tag -d v0.1
- 推送某個(gè)標(biāo)簽到遠(yuǎn)程:
$ git push origin <tagname>
- 推送全部尚未推送到遠(yuǎn)程的本地標(biāo)簽:
$ git push origin --tags
- 標(biāo)簽已經(jīng)推送到遠(yuǎn)程横媚,要?jiǎng)h除遠(yuǎn)程標(biāo)簽:先刪本地后再刪遠(yuǎn)程
$ git tag -d v0.9 $ git push origin :refs/tags/v0.9
- 切換到需要打標(biāo)簽的分支然后:
- ignore
忽略某些文件時(shí)纠炮,需要編寫.gitignore,.gitignore文件本身要放到版本庫里灯蝴,并且可以對(duì).gitignore做版本管理 github上配置好的文件- 強(qiáng)制添加到git:
$ git add -f App.class
- 提交不了要找出哪里出問題:
$ git check-ignore -v App.class
- 強(qiáng)制添加到git:
- 配置別名
- st代替 status:
$ git config --global alias.st status
-$ git unstage test.py
->$ git reset HEAD test.py
:$ git config -- global alias.unstage 'reset HEAD'
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
- 當(dāng)前倉庫的在.git/config的[alias]可以看到恢口,用戶的在.gitconfig
- st代替 status:
- 搭建遠(yuǎn)程服務(wù)器
- 安裝git:
$ sudo apt-get install git
- 創(chuàng)建一個(gè)git用戶,用來運(yùn)行g(shù)it服務(wù):
$ sudo adduser git
- 創(chuàng)建證書登錄:把所有公鑰導(dǎo)入到/home/git/.ssh/authorized_keys文件里穷躁,一行一個(gè)耕肩。
- 初始化Git倉庫:選定一個(gè)目錄作為Git倉庫,如/srv/sample.git问潭,在/srv目錄下輸入命令
$ sudo git init --bare sample.git
裸倉庫沒有工作區(qū)猿诸,把owner改為git$ sudo chown -R git:git sample.git
- 禁用shell登錄:/etc/passwd里把
git:x:1001:1001:,,,:/home/git:/bin/bash
改為git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
- 可以克隆了:
$ git clone git@server:/srv/sample.git
- 安裝git: