本文只是幫助你入門渠旁,從一個不會使用git的小白,到會解決開發(fā)中常見的使用船逮。
廢話不多說顾腊,直接進入正題。
git
git是用于Linux內(nèi)核開發(fā)的版本控制工具挖胃。與CVS杂靶、Subversion一類的集中式版本控制工具不同,它采用了分布式版本庫的作法酱鸭,不需要服務(wù)器端軟件吗垮,就可以運作版本控制,使得源代碼的發(fā)布和交流極其方便凹髓。git的速度很快烁登,這對于諸如Linux內(nèi)核這樣的大項目來說自然很重要。git最為出色的是它的合并追蹤(merge tracing)能力
安裝
安裝蔚舀,其實很簡單饵沧,和普通軟件安裝無異。這里不介紹了赌躺。
創(chuàng)建新倉庫
創(chuàng)建一個目錄狼牺,打開,然后執(zhí)行
git init
創(chuàng)建一個新的git倉庫.
初始化git的方法有很多種
- 在本地創(chuàng)建
- 在gitlab或github上創(chuàng)建寿谴,git clone下來锁右,
- 圖形界面上創(chuàng)建
克隆倉庫
執(zhí)行如下命令可以創(chuàng)建一個本地克隆版本:
git clone /path/to/repository
如果實在遠端服務(wù)器上的倉庫,你的命令會是這樣子:
git clone username@host:/path/tp/repository
克隆倉庫也有很多內(nèi)容,比如修改倉庫名之類的等等咏瑟。
工作流
你的本地倉庫由git維護的三棵樹
組成拂到。第一棵樹是你的工作目錄
,它持有實際文件码泞;第二個是暫存區(qū)(index)
,它像是緩存區(qū)兄旬,臨時保存你的改動;最后是HEAD
余寥,它指向你最后一次提交的結(jié)果领铐。
添加和提交
你可以提交更改(吧它們添加到暫存區(qū)),使用如下命令:
git add <filename>
git add *
git add .
這是git基本工作流程第一步宋舷;使用如下命令以時間提交改動:
git commit -m '代碼提交的信息'
現(xiàn)在绪撵,你的改動已經(jīng)提交到HEAD,但是沒有提交到你的遠端倉庫祝蝠。
推送改動
你的改動現(xiàn)在已經(jīng)在本地倉庫的HEAD中了音诈。執(zhí)行如下命令以將這些改動提交到遠端倉庫:
git push origin master
可以把master換成你想要推送的任何分支。
如果你沒有克隆現(xiàn)有的倉庫绎狭,并欲將的倉庫連接到某個遠程服務(wù)器细溅,你可以使用如下命令添加:
git remote add origin <server>
如此,你就可以將你的改動推送到所添加的服務(wù)器上去了儡嘶。
分支
分支是用來將特性開發(fā)絕緣開來的喇聊,在你創(chuàng)建倉庫的時候,master是"默認的"分支蹦狂。在其他分支進行開發(fā)誓篱,完成后再將他們合并到主分支上。
創(chuàng)建一個叫"feature_test"的分支,并切換過去:
git checkout -b feature_test
# or
git branch feature_test
git checkout feature_test
切換回主分支
git checkout master
刪除分支
git branch -d feature_test
除非你將分支推送到遠程倉庫鸥咖,不然該分支就是其他人不可見的:
git push origin <branch>
更新與合并
要更新你本地倉庫至最新改動燕鸽,執(zhí)行:
git pull origin <branch>
以在你工作目錄中獲取(fetch)
并合并(meger)
遠端的改動。
要合并其他分支到你當前分支(如master),執(zhí)行:
git merge <branch>
在這兩種情況下,git都會嘗試去自動合并并改動啼辣。遺憾的是,這可能并非每次都成功御滩,并可能出現(xiàn)(conficts
).這個時候就需要你修改這些文件手動合并這些沖突(conflicts
).改完后鸥拧,你需要執(zhí)行如下命令將他們標記為合并成功:
git add <filename>
在合并改動之前,你可以使用如下命令預覽差異:
git diff <source_branch> <target_branch>
標簽
為軟件發(fā)布創(chuàng)建標簽是推薦的削解。這個概念早已存在富弦,svn中也有。你可以執(zhí)行如下命令創(chuàng)建一個叫做1.0.0
的標簽:
git tag 1.0.0 abcdef1234
abcef1234是你想要標記的提交的ID的前10位字符氛驮,可以使用下列命令獲取提交ID:
git log
你也可以使用少一點的提交ID前幾位腕柜,只要它的指向具有唯一性。提交ID可以回滾。
log
如果想要了解蹦迪倉庫的歷史記錄盏缤,最簡單的命令:
git log
還可以添加一些參數(shù)來修改它的輸出砰蠢,得到自己想要的結(jié)果宪摧。只看某個人提交的記錄:
git log --auth=youdi
一個壓縮后每一條提交記錄只占位一行
git log --pretty=oneline
或者你想要通過ASCII藝術(shù)的樹形結(jié)構(gòu)來顯示所有的分支询枚,每個分支都標示了它的名字和標簽:
git log --graph --oneline --decorate --all
看看哪些文件改變了:
git log --name-status
這些只是你可以使用的參數(shù)一部分,更多可以查看:
git log --help
替換本地改動
假如你操作失誤(當然第岖,這最好永遠不要發(fā)生)潭流,你可以使用如下命令替換掉本地改動:
git checkout -- <filename>
此命令會使用 HEAD 中的最新內(nèi)容替換掉你的工作目錄中的文件竞惋。已添加到暫存區(qū)的改動以及新文件都不會受到影響。
假如你想丟棄你在本地的所有改動與提交灰嫉,可以到服務(wù)器上獲取最新的版本歷史拆宛,并將你本地主分支指向它
git fetch origin
git reset --hard origin/master
使用小貼士
彩色的git輸出
git config color.ui true
顯示歷史記錄時,每一個提交信息只顯示一行
git config format.pretty oneline
交互式添加文件到暫存區(qū)
git add -i
下面介紹一些工作中常用的小技巧:
撤銷剛剛git add(暫存區(qū)的文件)
git reset --hard <filename>
撤銷暫存區(qū)中指定的commit之前的提交
git reset --hard <commit的hash值>
注:--hard丟棄working directory中內(nèi)容的修改
--soft保留working directory中內(nèi)容的修改
修改commit最新一次的注釋信息
git commit -amend
會打開編輯器讼撒,可能是nano浑厚,或vim
修改以后,重新push到遠端倉庫
git push master origin -f
另外:
git commit -amend -m 'msg'
修改commit的歷史注釋信息
git rebase -i head~2
修改前2條提交記錄
版本回退
版本回退椿肩,需要使用git commit提交ID瞻颂,查看如下命令:
git log
回到指定版本
git reset --hard <commit hash value>
遠端倉庫也回退
git push origin <branch> -f
忽略文件
如果忽略文件,在倉庫中創(chuàng)建 .gitignore
vim .gitignore
*.pyc
/tmp
database.config
.gitignore
.tmp
進行匹配郑象,匹配成功文就不會添加到work directory.
儲藏(Stashing)
經(jīng)常有這樣的事情發(fā)生贡这,當你正在進行項目中某一部分的工作,里面的東西處于一個比較雜亂的狀態(tài)厂榛,而你想轉(zhuǎn)到其他分支上進行一些工作盖矫。問題是,你不想提交進行了一半的工作击奶,否則以后你無法回到這個工作點辈双。解決這個問題的辦法就是git stash命令。
“‘儲藏”“可以獲取你工作目錄的中間狀態(tài)——也就是你修改過的被追蹤的文件和暫存的變更——并將它保存到一個未完結(jié)變更的堆棧中柜砾,隨時可以重新應(yīng)用湃望。
git stash
查看儲藏的信息
git stash list
放出儲藏
git stash pop <stash index>
多個倉庫,開發(fā)
在公司開發(fā),一般都是將項目clone到自己名下的倉庫中痰驱,進行開發(fā)证芭,如何在本地拉去項目中最新的項目。
修改git配置文件 .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = git@github.com:jacksonyoudi/python-note.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[remote "google"]
url = git@github.com:google/python-note.git
fetch = +refs/heads/*:refs/remotes/origin/*
按上面配置好以后
拉取項目最新代碼担映,合并到本地
git pull google master
推送到項目上废士,而非自己倉庫
git push google feature
git的內(nèi)容就介紹到這里,以上都是皮毛蝇完,你只當做入門的初級文章即可官硝,不必深究矗蕊。如果有精力,希望你配置好github.
如想深入氢架,建議官方文檔傻咖。