高頻使用
- 查看分支 git branch -a
- 創(chuàng)建分支 git branch name
- 切換分支 git checkout name
- 創(chuàng)建并切換 git checkout -b name
- 合并某分支到當前分支 git merge name
- 刪除分支 git branch -d name
推薦閱讀
http://www.oschina.net/question/31384_157479
http://www.liaoxuefeng.com/wiki/
客戶端推薦: 可以使用 TortoiseGit 或者 SourceTree
(1) 創(chuàng)建本地倉庫
git init --bare shared.git (或者 git init)
(2)配置個人信息
git config user.name "wangli"
git config user.email "user@qq.com"
或者
git config --global user.name "wangli"
git config --global user.email "user@qq.com"
(3)cat index.jsp
(4)echo "this is test file" > index.jsp
(5)復制倉庫到本地
git clone /f/software/repository/git/shared.git/ . (注意有個點,表明當前目錄)
git clone git@github.com:wangli0/appdemo.git .或者
(git clone git@github.com:wangli0/appdemo.git)
(6)mkdir learngit
(7)pwd //顯示當前路徑
(8)git status
命令可以讓我們時刻掌握倉庫當前的狀態(tài)
(9)未提交
$ git diff readme.txt (diff --> difference)
【使用時機任岸,修改readme.txt芽腾,但還沒有準備提交(還未add commit),想看看此次修改和上次提交的區(qū)別】
提交后
用git diff HEAD -- readme.txt
命令可以查看工作區(qū)和版本庫里面最新版本的區(qū)別
(10)git status掌握工作區(qū)的狀態(tài)
(11)git log (顯示從最近到最遠的提交日志) 如果嫌輸出信息太多份乒,看得眼花繚亂的腿堤,可以試試加上--pretty=oneline (git log --pretty=oneline)
(12)版本回退
或者 指定回退的commit對象的id
($ git reset --hard 3628164) 版本號沒必要寫全排龄,git會自動找
Git中波势,用HEAD
表示當前版本,上一個版本就是HEAD^
,上上一個版本就是HEAD^^,再往上就是 HEAD~100
(13)用git log
穿梭前橄维,可以查看提交歷史尺铣,以便確定要回退到哪個版本, 要重返未來,用git reflog
查看命令歷史挣郭,以便確定要回到未來的哪個版本
(14)git checkout
git checkout -- readme.txt把readme.txt
文件在工作區(qū)的修改全部撤銷
--很重要迄埃,沒有的話就變成了“切換到另一個分支”的命令
*兩種情況*
一種是readme.txt自修改后還沒有被放到暫存區(qū),現(xiàn)在兑障,撤銷修改就回到和版本庫一模一樣的狀態(tài)侄非;(還不如再次git pull一次或者 直接vim readme.txt)【改變的是工作區(qū)內(nèi)容】
一種是readme.txt已經(jīng)添加到暫存區(qū)后,***又在工作區(qū)作了修改xx ***流译,現(xiàn)在逞怨,撤銷修改就回到 剛剛git add到暫存區(qū)時的狀態(tài)[暫存區(qū)還在](且 工作區(qū)內(nèi)容撤銷xx)
(15)git reset HEAD readme.txt
把暫存區(qū)的修改撤銷掉(unstage)[暫存區(qū)不復存在],重新放回工作區(qū)
(16)刪除文件(注福澡,git中刪除也是修改操作)
rm index.jsp
git rm index.jsp
git status
git commit -m "remove index.jsp"
(17)github 的使用
由于你的本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的
需創(chuàng)建 SSH key
$ ssh-keygen -t rsa -C "youremail@example.com"
(18)touch readme.md
創(chuàng)建一個空文件
(19)無論是
(1)從遠程克隆
(2)或者是本地項目提交到github 都需要先在github上面創(chuàng)建一個倉庫叠赦。方式二 用的多,此種方式連README.md都不能創(chuàng)建【空倉庫】,一旦創(chuàng)建除秀,本地和遠程版本就不一致了糯累,需要先pull才可以
方法1 省略
方法2
echo # Appdemo >> README.md
git initgit add README.md
git commit -m "first commit"
git remote add origin git@github.com:wangli0/Appdemo.gitgit
push -u origin master
注意: 用git push命令,實際上是把當前分支master推送到遠程册踩。由于遠程庫是空的泳姐,我們第一次推送master分支時,加上了-u參數(shù)暂吉,Git不但會把本地的master分支內(nèi)容推送的遠程新的master分支胖秒,還會把本地的master分支和遠程的master分支關(guān)聯(lián)起來
移除關(guān)聯(lián)
git remote rm origin
(如果關(guān)聯(lián)已經(jīng)添加,再次添加會報錯)
(20)git checkout -b dev
創(chuàng)建dev分支慕的,-b參數(shù)表示 創(chuàng)建并切換
git checkout -b dev
<===>
git branch dev (創(chuàng)建分支 dev)
git checkout dev (切換到dev分支)
git branch 列出當前的分支
(21)合并分支 && 刪除分支
如 當前的分支是 master
git merge dev // 把dev分支合并到當前分支(默認是Fast-forward快進模式 也就是直接把master
指向dev的當前提交阎肝,所以合并速度非常快肮街。)
git branch -d dev //現(xiàn)在可以刪除 dev分支了
(22)合并分支造成的沖突 (例子)
步驟1
master 分支
git add a.jsp
git commit a.jsp -m "the content is a"
dev 分支
git add a.jsp
git commit a.jsp -m "the content is aaaa"
步驟2
合并分支
$ git merge dev // 沖突產(chǎn)生风题,兩分支同時修改了一行 , git status查看 沖突的文件
步驟3
修改沖突:
vim a.jsp
git add a.jsp
git commit -m "conflict fixed" (commit不加文件名哦)
(23)git log --graph --pretty=oneline --abbrev-commit 查看 分支的合并情況 刪除分支 git branch -d dev
(24)git log --graph
命令可以看到分支合并圖
(25)合并分支 續(xù)
git merge dev(快進模式)
git merge --no-ff -m "merge with no-ff" dev
(26)查看分支歷史 git log
git log --graph --pretty=oneline --abbrev-commit
(27)合并分支時,加上--no-ff
參數(shù)就可以用普通模式合并嫉父,合并后的歷史有分支俯邓,能看出來曾經(jīng)做過合并,而 fast forward
合并就看不出來曾經(jīng)做過合并熔号。
(28)bug分支
> 1.正在 dev分支上工作,此時需修復bug
git stash (保存當前的工作區(qū)如 修改index.jsp文件或 git add index.jsp文件 但是還沒有提交 commit)
> 2. 切換到修復bug的分支 如 master
git checkout master
> 3. 創(chuàng)建bug分支
git checkout -b issue-101 (在此上面修復bug)
> 4. 修復完成后鸟整,切換到master分支,合并分支issue-101引镊,并刪除issue-101分支
git checkout master
git merge --no-ff -m "merged bug fix 101" issue-101
git branch -d issue-101
> 5. 是時候接著回到dev分支干活了
git checkout dev (git status 發(fā)現(xiàn) working directory clean工作區(qū)是空的 )
> 6. git stash list 查看工作現(xiàn)場存哪里了
> 7. 恢復工作區(qū)
***方式1***
git stash apply (恢復后,stash內(nèi)容并不刪除)
***方式2***
git stash pop (恢復的同時把stash內(nèi)容也刪了)
> 8. 你可以多次stash篮条,恢復的時候弟头,先用git stash list
查看,然后恢復指定的stash涉茧,用命令:
$ git stash apply stash@{0}
-------------------------
(29)標簽
git tag v1.0 (標簽就是快照赴恨,在當前最新commit上打了一個快照)
或者針對 某個commit id 打標簽
git tag v1.0 622222 (622222是commit id)
(30)查看標簽列表
git tag
(31)查看標簽信息
git show v1.0 (git show <tagname>)
(32)創(chuàng)建 帶有說明的標簽
git tag -a v1.0 -m "version1.0的標簽" 6222222
(33)操作標簽
git tag -d v1.0 刪除標簽 (因為創(chuàng)建的標簽都只存儲在本地,不會自動推送到遠程伴栓。所以伦连,打錯的標簽可以在本地安全刪除。)
git push origin v1.0 (git push origin <tagname>
)推送某個標簽 到遠程倉庫
git push origin --tags //推送本地所有為推送的 標簽到遠程
刪除已經(jīng)推送到遠程的標簽
git tag -d v1.0
git push origin :refs/tags/v1.0 //注意格式
(34)git config --global color.ui true
//Git顯示顏色钳垮,會讓命令輸出看起來更醒目
(35)feature分支(和bug分支惑淳,普通分支完全一樣,主要用于開發(fā)新功能)
> 1.git checkout -b feature-1 新建分支饺窿,并編寫完成新功能
> 2. git checkout dev (切換開發(fā)分支)
> 3. git branch -d feature-1
一切順利的話歧焦,feature分支和bug分支是類似的,合并肚医,然后刪除
> 4. 但是不順利事情是常有的(突然因經(jīng)費問題被叫停 )
分支還沒有被合并绢馍,如果刪除向瓷,將丟失掉修改,如果要強行刪除舰涌,需要使用命令git branch -D feature-1(**合并后** 的分支刪除方法是git branch -d feature-1 小寫)
丟棄一個沒有被合并過的分支猖任,可以通過git branch -D <name>
強行刪除
(36)推送分支
遠程倉庫的默認名稱是origin
推送分支,就是把該分支上的所有本地提交推送到遠程庫舵稠。推送時超升,要指定本地分支,這樣哺徊,Git就會把該分支推送到遠程庫對應的遠程分支上
git push origin master // 指定本地分支 master->遠程master
git push origin dev //指定本地分支 dev ->遠程 dev
遠程庫clone時候 //默認只能clone到遠程分支的master分支
我需要在dev分支上開發(fā)室琢,就必須創(chuàng)建遠程origin的dev分支到本地
`git checkout -b dev origin/dev`
(37)兩人同時push 產(chǎn)生沖突
同樣的一個文件 index.jsp ,兩人都做了修改
人1: 先git push index.jsp -m 'update a file"
人2: git push index.jsp -->出現(xiàn)沖突
原因: 因為你的小伙伴的最新提交和你試圖推送的提交有沖突
解決方案:
人2 : git pull
把最新的提交從origin/dev抓下來落追,然后盈滴,在*本地合并*,解決沖突轿钠,再推送
注意: pull的時候 需要指定 本地 dev分支與 遠程 origin/dev分支的鏈接 `git branch --set-upstream dev origin/dev`
(38)git remote -v 查看 遠程庫信息
注意事項
* 從本地推送分支巢钓,使用git push origin branch-name
,如果推送失敗疗垛,先用git pull
抓取遠程的新提交
* 本地新建的分支如果不推送到遠程症汹,對其他人就是不可見的
* git pull命令,不能在同一個用戶下面git pull得到自己剛剛提交的贷腕,會提示當前文件已經(jīng)是最新的背镇,pull 不下來
* 直接在遠程客戶端 web上面更新a 文件,在電腦上面就可以git pull得到剛剛更新的代碼
* 不同的用戶目錄(本地倉庫如user1泽裳,user2)默認都有一個master分支
* git checkout
其實是用版本庫里的版本替換工作區(qū)的版本瞒斩,無論工作區(qū)是修改還是刪除,都可以“一鍵還原”
* github 上面 的 pull request用于你fork了別人的項目涮总,然后修改fork后的代碼胸囱,想提交到 別人的項目里面,就需要點擊 pull request
* 研究發(fā)現(xiàn)瀑梗,如APPdemo文件夾下烹笔,git init 初始化本地倉庫
git add ,git commit,都是在當前文件夾下面進行的
只有g(shù)it push推送到遠程倉庫(或者本機其他目錄下的倉庫中[也算遠程倉庫,只不過是離線的遠程倉庫])
***前提是需要關(guān)聯(lián)本地倉庫 與遠程倉庫***
*** git clone 命令時候 默認會做一次關(guān)聯(lián)***
***沒有管理的話抛丽,需要我們自己手動關(guān)聯(lián)***
* 但是不管遠程倉庫(net) 遠程倉庫(本機)箕宙,本地倉庫(某一個文件夾)本質(zhì)上都是倉庫
* 當Git無法自動合并分支時,就必須首先解決沖突铺纽。解決沖突后柬帕,再提交,合并完成
master分支是主分支,因此要時刻與遠程同步陷寝;
dev分支是開發(fā)分支锅很,團隊所有成員都需要在上面工作,所以也需要與遠程同步凤跑;
bug分支只用于在本地修復bug爆安,就沒必要推到遠程了,除非老板要看看你每周到底修復了幾個bug仔引;
feature分支是否推到遠程扔仓,取決于你是否和你的小伙伴合作在上面開發(fā)。
標簽是為了打上版本號信息咖耘,當然不能亂叫翘簇,通常用:
v1.0, v1.1, v2.0 ...
或者按發(fā)布日期:
build-20150702, build-20150910 ...
如果你想修復bootstrap的一個bug,或者新增一個功能儿倒,立刻就可以開始干活版保,干完后,往自己的倉庫推送夫否。
如果你希望bootstrap的官方庫能接受你的修改彻犁,你就可以在GitHub上發(fā)起一個pull request。當然凰慈,對方是否接受你的pull request就不一定了汞幢。
有些時候,你必須把某些文件放到Git工作目錄中微谓,但又不能提交它們急鳄,比如保存了數(shù)據(jù)庫密碼的配置文件啦,等等堰酿,每次git status
都會顯示Untracked files ...
,有強迫癥的童鞋心里肯定不爽张足。
好在Git考慮到了大家的感受触创,這個問題解決起來也很簡單,在Git工作區(qū)的根目錄下創(chuàng)建一個特殊的.gitignore
文件为牍,然后把要忽略的文件名填進去哼绑,Git就會自動忽略這些文件。
不需要從頭寫.gitignore
文件碉咆,GitHub已經(jīng)為我們準備了各種配置文件抖韩,只需要組合一下就可以使用了。所有配置文件可以直接在線瀏覽:[https://github.com/github/gitignore](https://github.com/github/gitignore)
如忽略
Python編譯產(chǎn)生的.pyc
疫铜、.pyo
茂浮、dist
等文件或目錄:
// # 是注釋 *通配符
# Python:
*.py[cod]
*.so
*.egg
git 工作區(qū) 和暫存區(qū) 各個分支用的是同一個,僅僅提交的時候由于指針指的地方不同,令我們感覺似乎在不同區(qū)間上面工作席揽,且git限定我們 工作區(qū)間被修改(如 index.jsp 被修改或被git add但是未 commit) 此時 git是不允許git checkout (切換分支的)
注意關(guān)聯(lián)遠程倉庫 和 關(guān)聯(lián) 遠程分支
**關(guān)聯(lián)遠程倉庫**
git remote add origin git@github.com:wangli0/Appdemo.gitgit
**關(guān)聯(lián)遠程分支**
git branch --set-upstream dev origin/dev
某教程里面的簡單命令
==============版本管理員操作========================
第一步: 創(chuàng)建數(shù)據(jù)倉庫
git init --bare shared.git
==============開發(fā)人員1操作=============================
第二步:復制倉庫到本地
git clone /f/software/repository/git/shared.git/ . (注意有個點顽馋,表明當前目錄)
第三步:設(shè)置個人信息
git config user.name "user1"
git config user.email "user1@163.com"
第四步:忽略無需版本控制的文檔
echo "*.txt" > .gitignore
第五步:新建一個文件
echo "User1 add content" > index.jsp
第六步:提交文件
git add index.jsp
git commit -m "User1 add the file"
第七步:把自己的倉庫提交到公共服務(wù)器
git push origin master
==============開發(fā)人員2操作=============================
第八步:復制倉庫到本地
git clone /f/software/repository/git/shared.git/ .
第九步:設(shè)置個人信息
git config user.name "user2"
git config user.email "user2@163.com"
第十步:忽略無需版本控制的文檔
echo "*.txt" > .gitignore
第十一步:新建一個文件
echo "User2 add content" >> index.jsp
第十二步:提交文件
git add index.jsp
git commit -m "User2 add the file!"
第十三步:把自己的倉庫提交到公共服務(wù)器
git push origin master
==============開發(fā)人員1操作=============================
第十四步:下載服務(wù)器最新數(shù)據(jù)
git pull
網(wǎng)絡(luò)上面別人對git的一些理解(此段轉(zhuǎn)載)
大白話講解如何給github上項目貢獻代碼
(1) 最最開始,我以為git clone [項目地址]幌羞,也就是把代碼clone下來 然后修改寸谜,然后push到項目里就可以了。后來發(fā)現(xiàn)属桦,這種情況只適合該項目屬于你自己的情況熊痴,如果你git clone別人的項目代碼,你想push都push不上去聂宾,因為 git push 不是需要你輸入github帳號密碼么果善。
(2)然后 我就知道了 github上 不是有個fork么, 好亏吝,那么給別人的項目提交代碼的方式就有了岭埠,先fork下別人的代碼,于是你的github上就出現(xiàn)了同名的項目蔚鸥,這個項目就屬于你自己了惜论,你把這個自己的項目git clone到本地,修修改改止喷,然后push到你自己的項目里馆类,那么你如何把你對自己項目的改動,給發(fā)到之前fork的那個原項目呢弹谁,看見了沒乾巧,在github上你的項目頁面有個按鈕,叫Pull request预愤,對 你點它就會把你的修改發(fā)到對方的項目里沟于,人還會收到郵件呢,由原項目主人決定是否接受你的修改植康。但是旷太,這樣問題就出來了,在你fork他的項目之后销睁,如果他又更新了代碼供璧,你自己fork的項目怎么做到和原項目同步呢? 我就想啊冻记,是不是 我還得重新git clone原項目的代碼睡毒,然后手動合并到我fork的項目里呢。冗栗。演顾。梁老師說供搀,你丫這太蛋疼了,肯定不是這么麻煩偶房,我細想趁曼,也是啊,這不2么棕洋。挡闰。。
(3)然后掰盘,從《Pro git》上看到一個知識點摄悯,我擦,github居然可以給項目添加合作者愧捕,也就是說奢驯,假如你,對次绘,說你呢瘪阁,戴眼鏡那個,你想?yún)⑴c我的項目邮偎,你跟我說一聲管跺,我就把你添加到我的項目里作為合作者,這個選項在項目的設(shè)置里面有禾进,只要我添加你了豁跑,你就可以git clone我的代碼然后修修改改,然后直接push上來就行了泻云,就不用fork那么麻煩了艇拍,如果你要更新服務(wù)器代碼,只要git pull就行了宠纯,看 合作者這東西多方便卸夕,就像我們在公司用svn似的。
(4)然后我就想啊婆瓜,有了合作者還需要你丫fork這個功能干啥快集?仔細一想,你寫個好項目勃救,不能隨便加合作者啊,加了個熊孩子把你代碼改廢了可咋整治力,這年頭熊孩子很多蒙秒,我自己不就是一個么。所以fork肯定還是需要宵统,fork就是專門預防熊孩子的晕讲,這就是真相覆获!那么前面說道到fork之后如何與原項目同步的問題還在啊,沒有得到解決瓢省。
(5)于是《Pro git》再次給了我一個解答弄息,具體流程是你啊想給我的項目做貢獻,你先git clone我的代碼到本地勤婚,然后修修改改摹量,然后你不是不能push到我的項目里么,你可以先在github頁面上fork我的項目馒胆,有了你自己的項目地址(url)之后呢缨称,你在本地操作git remote add [sort name] [your url],意思就是添加第二個遠程倉庫地址祝迂,這個倉庫的“昵稱”就是你剛指定的[sort name]睦尽,然后,你之后push文件呢 就通過指定這個[sort name]來push到這個你自己的倉庫里型雳。等你覺得想要把你改的發(fā)給原項目同步当凡,就在你的項目上點Pull request按鈕.說下另一種情況,如果是纠俭,原項目發(fā)生了改動沿量,你要想同步到本地,就直接從git fetch origin 從原項目的地址同步代碼柑晒,然后再merge就好了欧瘪。當然,如《Pro git》上所寫匙赞,你可以通過新建分支的方式往自己的項目上push佛掖,這樣同步的時候直接fetch就行了。
使用git在本地創(chuàng)建一個項目的過程
$ makdir ~/hello-world //創(chuàng)建一個項目hello-world
$ cd ~/hello-world //打開這個項目
$ git init //初始化
$ touch README
$ git add README //更新README文件
$ git commit -m 'first commit' //提交更新涌庭,并注釋信息“first commit”
$ git remote add origin [git@github.com:defnngj/hello-world.git](mailto:git@github.com:defnngj/hello-world.git) //連接遠程github項目
$ git push -u origin master //將本地項目更新到github項目上去
git 常見錯誤
fatal: remote origin already exists.
如果輸入$ git remote add origin [git@github.com:djqiang(github帳號名)/gitdemo(項目名).git](mailto:git@github.com:djqiang/gitdemo.git)
提示出錯信息:fatal: remote origin already exists.
解決辦法如下:
1芥被、先輸入$ git remote rm origin
2、再輸入$ git remote add origin [git@github.com:djqiang/gitdemo.git](mailto:git@github.com:djqiang/gitdemo.git) 就不會報錯
一張圖告訴你 git的最 常用命令
技巧篇
漂亮的 log界面
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"
最近一次的提交
git config --global alias.last 'log -1' //等價 git log -1
配置文件
配置Git的時候坐榆,加上--global是針對當前用戶起作用的巍沙,如果不加,那只針對當前的倉庫起作用溯街。
配置文件放哪了杈女?每個倉庫的Git配置文件都放在.git/config文件中
cat .git/config
難點篇
git stash命令 stash(隱藏,藏匿)
使用場景:
當你接到一個修復一個bug的任務(wù)時,創(chuàng)建一個分支issue-101
來修復它豪诲,但是當前正在dev
上進行的工作只進行到一半,還沒法提交顶捷,但是此時 必須在兩個小時內(nèi)修復該bug,怎么辦屎篱?
Git還提供了一個stash
功能服赎,可以把當前工作現(xiàn)場“儲藏”起來葵蒂,等以后恢復現(xiàn)場后繼續(xù)工作
使用說明:
使用
git stash
就可以將你當前未提交到本地(和服務(wù)器)的代碼推入到Git的棧中,這時候你的工作區(qū)間和上一次提交的內(nèi)容是完全一樣的重虑,所以你可以放心的修 Bug践付,等到修完Bug,提交到服務(wù)器上后缺厉,再使用'git stash apply'將以前一半的工作 應用回來
也許有的人會說永高,那我可不可以多次將未提交的代碼壓入到棧中?
答案是可以的芽死。當你多次使用'git stash'命令后乏梁,你的棧里將充滿了未提交的代碼,這時候你會對將哪個版本應用回來有些困惑,'git stash list'命令可以將當前的Git棧信息打印出來关贵,你只需要將找到對應的版本號遇骑,例如使用'git stash apply stash@{1}'就可以將你指定版本號為stash@{1}的工作取出來,當你將所有的棧都應用回來的時候揖曾,可以使用'git stash clear'來將棧清空落萎。在這里順便提下git format-patch -n , n是具體某個數(shù)字, 例如 'git format-patch -1' 這時便會根據(jù)log生成一個對應的補丁炭剪,如果 'git format-patch -2' 那么便會生成2個補丁练链,當然前提是你的log上有至少有兩個記錄
看過上面的信息,就可以知道使用場合了:當前工作區(qū)內(nèi)容已被修改奴拦,但是并未完成媒鼓。這時Boss來了,說前面的分支上面有一個Bug错妖,需要立即修復绿鸣。可是我又不想提交目前的修改暂氯,因為修改沒有完成潮模。但是,不提交的話痴施,又沒有辦法checkout到前面的分支擎厢。此時用Git Stash就相當于備份工作區(qū) 了。然后在Checkout過去修改辣吃,就能夠達到保存當前工作區(qū)动遭,并及時恢復的作用。
多人協(xié)作小結(jié)
- 查看遠程庫信息神得,使用git remote -v厘惦;
- 本地新建的分支如果不推送到遠程,對其他人就是不可見的循头;
- 從本地推送分支绵估,使用git push origin branch-name,如果推送失敗卡骂,先用git pull抓取遠程的新提交国裳;
- 在本地創(chuàng)建和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name全跨,本地和遠程分支的名稱最好一致缝左;
- 建立本地分支和遠程分支的關(guān)聯(lián),使用git branch --set-upstream branch-name origin/branch-name浓若;
- 從遠程抓取分支渺杉,使用git pull,如果有沖突挪钓,要先處理沖突是越。