1. 配置
git config --global user.name "your name" git config --global user.email mail@box.com git config --global color.ui true git config --global core.editor vi git config --global alias.lol "log --graph --all" 設(shè)置alias,這樣lol就是自己新的命令了。
2.基本使用 1.顯示當(dāng)前的配置信息 git config --list
2. 創(chuàng)建repo 從別的地方獲取 git clone git://git.kernel.org/pub/scm/git/git.git
自己建立 mkdir test cd test git init
3. 顯示狀態(tài) git status
4. commit git add file.1 file.2 先增加文件,增加到index中。這樣commit的時(shí)候才知道要commit哪些文件。 或者 git add -p 用來(lái)interactively選擇哪些改變需要被commit git commit -m "log message"
或者 git commit -a 自動(dòng)檢查應(yīng)該commit什么文件。如果是新增的文件,仍然要使用git add來(lái)添加。
5. 顯示以前的工作 git log 輸出格式 git log git log -p 顯示patch git log --stat 顯示改動(dòng)的一個(gè)總結(jié) git log --graph 只顯示當(dāng)前branch的 git log --graph --all 顯示所有branch的 git log --graph --all --decorate 顯示branch的名字
git log --pretty=oneline, short, full, fuller 輸出的log 形式不同 git log --pretty=format:"%h - %an, %ar : %s" 按照指定的格式輸出。 關(guān)于--pretty的其他選項(xiàng)和具體的format格式,參考 git log --help中PRETTY FORMAT這部分。
git log --follow file.c 這個(gè)功能很有意思,尤其是當(dāng)file.c被移動(dòng)后。 通常我們會(huì)移動(dòng)某個(gè)文件到某個(gè)目錄下。如果這么做,git log是不能顯示目錄移動(dòng)前的記錄的。 那就加上 --follow吧。
git log的篩選 git log -2 -p 顯示最近兩次commit的log 和 diff git log --author="Author Name" 篩選特定作者的log git log --since="2012-2-23" --before="2012-2-24" 篩選時(shí)間段 git log --grep="key word" 在commit 的message中查找關(guān)鍵字 git log branch --not master 查看在branch上的,但不在master上的記錄。
git log -S"func_name" 查找某個(gè)字符出現(xiàn),或者移出的commit。 比如可以查找一個(gè)函數(shù)是什么時(shí)候添加,或者刪除的。
git show sha1 這個(gè)sha1是每個(gè)commit的sha1,這樣顯示某個(gè)commit的完全信息,包括diff
6. 撤銷改動(dòng) git checkout -- file.1 撤銷了file.1的這次改動(dòng)。只是撤銷了沒(méi)有staged的改動(dòng). 中間的 -- 表明了這是一個(gè)文件 而不是一個(gè)branch的名字
git reset --hard HEAD 撤銷了所有沒(méi)有commit的改動(dòng),包括了stage的和沒(méi)有stage的。 這條命令的結(jié)果一樣 git checkout HEAD file.1 包括了staged 和沒(méi)有staged的都會(huì)清除。
有時(shí)候我們發(fā)現(xiàn),之前做個(gè)一個(gè)commit有問(wèn)題,不想要,想要去掉。 git revert HEAD 自動(dòng)得重新做一個(gè)commit,將最后一次的commit返回回來(lái)。 git revert HEAD^ 自動(dòng)得重新做一個(gè)commit,將最后第二次的commit 返回回來(lái)。 7. 刪除一個(gè)commit git reset --hard HEAD~1 刪除了最近的commit
8. 修改最近的一個(gè)commit git commit --amend 7.顯示所做的改動(dòng) git diff 顯示所有的改動(dòng)。 沒(méi)有add到index中的。
git diff --staged或者 git diff --cached 顯示staged改動(dòng),也就是add的東東,也就是將要commit的東東。
git diff commit1 commit2 顯示這兩個(gè)commit之間的變動(dòng), 從commit1到commit2的變動(dòng)。
git diff commit1..commit2 兩個(gè)點(diǎn),效果跟上面的一樣
git diff commit1...commit2 三個(gè)點(diǎn),表示的是發(fā)生在commit2分支,一直到commit1和commit2共同父親的變化。
git blame -C file1.c 顯示文件具體的改動(dòng)。。。。恩,好像是用來(lái)找是誰(shuí)的錯(cuò)?
git blame -Ln,m file1.c 查看n,m兩行間的改動(dòng)。
git blame commit1~1 -Ln,m file1.c 查看commit1版本前的改動(dòng). 追查之前的log。
git blame commit1~1 -Ln,m -- old/file.c 如果這個(gè)文件被重命名過(guò),或者移動(dòng)過(guò)位置,就要輸入舊的文件的名字。 而且一定要加上 -- , 一定。
8. 刪除某個(gè)文件 git rm file-name 從庫(kù)和當(dāng)前的working directory中刪掉這個(gè)文件 git rm --cached file-name 只從庫(kù)中刪除,保留當(dāng)前的本地文件。
9. 重命名一個(gè)文件 git mv file file-new
10. 應(yīng)用patch git apply patch-file 這樣做從patch-file中應(yīng)用這個(gè)patch。 效果和patch命令類似。 但是好處是,git apply要么成功,要么不成功。不想patch,有可能有部分的patch打上了,但是有的沒(méi)有打上。 git apply后,并沒(méi)有自動(dòng)生成一個(gè)commit.
git apply --check 可以用來(lái)檢測(cè)這個(gè)patch 是不是會(huì)產(chǎn)生沖突或者失敗。
git am patch-file 這是專門為git 設(shè)計(jì)的命令。 patch-file是通過(guò)git format-patch 生成的。 其中包含了作者信息和簡(jiǎn)單描述。 git am后,會(huì)自動(dòng)的生成一個(gè)commit.
git am --resolved git am 過(guò)程中可能會(huì)有conflict. 如過(guò)遇到conflict, 那就需要手動(dòng)修改code, git add 后 用git am --resolved
11. git 制作patch 具體步驟寫在了 http://blog.csdn.net/richardysteven/article/details/6701156
3. commit range 在git中,我們經(jīng)常需要制定一個(gè)commit的范圍,比如git log中,可以顯示某范圍內(nèi)的改動(dòng)。 除了man gitrevisions, 在這個(gè)網(wǎng)站上也有不過(guò)的描述,尤其是對(duì) double dot 和 triple dot http:///questions/462974/whats-the-difference-between-and-in-git-commit-ranges 而且這種語(yǔ)法,在git log和git diff兩種情況下,有不同的意義.
在git log中, git log ^r1 r2 表示顯示從r2到root,但是去掉r1到root中和r2到root有重復(fù)的。 這個(gè)也可以表示為 git log r1..r2.
git log r1...r2 表示 顯示從r1到root, r2到root,但是去掉他們共有的部分。
我這樣理解, 前一種顯示的是樹(shù)上的一個(gè)分支。而后一種顯示了兩個(gè)分支。
在git diff中 git diff目的是比較兩個(gè)commit之間的區(qū)別。
git diff A B 和 git diff A..B 是一樣的,就是顯示這兩個(gè)之間的區(qū)別。
git diff A...B 和 git diff $(git-merge-base A B) B一樣。 就是顯示 在B這個(gè)分支上,做了什么改動(dòng)。 有時(shí)候這個(gè)命令是,git merge-base A B
在一個(gè)branch上,但不在另一個(gè)branch上 git log local_copy ^kernel 這樣可以再merge前,看看都有哪些東西要commit. 這個(gè)命令用來(lái)看,在local_copy branch上,但是不在kernel branch上的。
4. Branch 1. 顯示branch git branch git branch -v 顯示詳細(xì)點(diǎn)的信息 git branch --merged
2. 創(chuàng)建branch git branch testing 或者 git checkout -b new_brach 這樣新建并且切換到了new_brach上
還有一種創(chuàng)建branch的辦法是 git branch branch_name b42294309188d57bf3398ed35660170a237d8c0a 注意,這后面這一長(zhǎng)串的就是每個(gè)commit的sha1碼。
3. 切換到某個(gè)branch git checkout testing
4. 圖形化顯示branch信息 gitk gitk --all
5. merge 先轉(zhuǎn)到要merge到的branch,如 git checkout master 一般都會(huì)merge到master上。
然后調(diào)用 git merge testing 這樣就把testing branch上的改動(dòng)merge過(guò)來(lái)了。
6. 刪除branch 好了,這個(gè)branch不用了,刪掉吧 git branch -d testing
7. 處理conflict 在merge的過(guò)程中一般會(huì)遇到conflict. 先用git status查看哪些文件產(chǎn)生的沖突。 可以逐一修改文件,也可以用git mergetool 來(lái)進(jìn)行修改。 當(dāng)所有的都修改好, 使用git commit。
8。 查看有哪些branch merge進(jìn)來(lái)了,哪些沒(méi)有 git branch --merged git branch --no-merged 比如說(shuō)我們checkout 到 master,用--no-merged 可以看到還有哪個(gè)branch的改動(dòng)沒(méi)有到master上。
5. Stash git stash 用來(lái)備份當(dāng)前工作區(qū)的內(nèi)容。 從最近的一次提交中讀取相關(guān)內(nèi)容,讓工作區(qū)保證和上次提交的內(nèi)容一致。 可以多次使用git stash來(lái)保存當(dāng)前的修改。
git list可以看到一共保存了多少次。 linux-2.6$ git stash list git stash save "name" git stash 這兩個(gè)都是保存當(dāng)前的改動(dòng), 如果有name則可以添加一個(gè)方便辨識(shí)的標(biāo)簽。
git stash apply 用來(lái)恢復(fù)最近一次的修改。 git stash apply stash@{1}來(lái)恢復(fù)指定的修改。
git stash pop stash@{1} 的作用和git stash apply類似。 git stash pop 會(huì)從stash棧中移除某個(gè)記錄,而git stash apply不會(huì)。
git stash clear 清空棧。
6. Tag 1. 顯示tag git tag 顯示所有的tag
匹配顯示 $ git tag -l v3.0*
git show v3.0
3. 創(chuàng)建tag git tag -a v1.4 -m "my version 1.4"
git tag -s v1.5 -m "my version 1.5" 這個(gè)將會(huì)加上pgp的簽名
對(duì)于一個(gè)-s的tag, 你可以 git tag -v v1.5 來(lái)驗(yàn)證這個(gè)tag, 當(dāng)然你需要有對(duì)方的PGP公鑰。
git tag v1.4-lw 這個(gè)是輕量級(jí)的tag。
git tag -a v1.2 SHA 對(duì)某個(gè)指定的SHA打tag,默認(rèn)是HEAD
git push origin v1.2 git push origin --tags 默認(rèn)情況下是不會(huì)將tag的信息送到遠(yuǎn)端的。 第一的命令將某個(gè)指定的tag送到遠(yuǎn)端。 第二個(gè)命令將所有的tag送到遠(yuǎn)端。
7. Remote Repository https://github.com/ 這個(gè)網(wǎng)上可以提供建立一個(gè)免費(fèi)的git的repo remote repo是用來(lái)多個(gè)人合作的。恩。。。,比較高級(jí)。
顯示remote repo的信息 git remote git remote -v git remote show origin
添加別的remote 庫(kù) git remote add localname URL 也就是用這個(gè)localname 來(lái)代表URL
然后就可以從remote中下載代碼 git fetch localname
默認(rèn)glone后local的HEAD是track在origin/master上的, 所以如果你想要work on別的branch,需要先在本地建立一個(gè)branch git branch --track feature origin/feature 這個(gè)意思是本地有個(gè)叫feature的branch,這個(gè)是track origin/feature的。
查看remote的情況 git remote show origin
上傳changes,如果你有權(quán)限,你可以上傳自己的更新到remote git push origin master 意思是push到 origin這個(gè)遠(yuǎn)端樹(shù)的master 分支上 git push origin :master 是刪除remote的分支
下載別的更新? git pull 下載了更新就直接merge了
當(dāng)本地的git倉(cāng)庫(kù)更新后,我們需要與遠(yuǎn)端server上的倉(cāng)庫(kù)同步。 一般這么做 git fetch 將同步一下?tīng)顟B(tài) git fetch -p 可以清空遠(yuǎn)端已經(jīng)不用的分支 git branch -v 可以看到本地倉(cāng)庫(kù)中分支的狀態(tài)。 git branch -av 可以看到遠(yuǎn)端和本地分支的狀態(tài) git checkout branchname 換到你想要更新的local branch上 git rebase origin/branchname 這樣可以將本地做的commit 取下,并重新apply到最新的地方。
8. Some Tips 1. 假如編輯到了某個(gè)版本,發(fā)現(xiàn)某個(gè)功能不起作用了,或者有bug了。但是自己知道之前的某個(gè)版本是好的。 git bisect start git bisect bad 現(xiàn)在這個(gè)版本是壞的 git bisect good good_commit good_commit這個(gè)版本是好的
接下來(lái)編譯,測(cè)試。 如果是好的 git bisect good 如果還是不好 git bisect bad 這樣git都會(huì)給你輸出某個(gè)中間的版本讓你繼續(xù)測(cè)試。
找到了錯(cuò)誤,用 git bisect reset 恢復(fù)到原先的版本。
2. git 命令在bash中自動(dòng)補(bǔ)全 http:///book/ch2-7.html 將git-completion.bash 拷貝到 /etc/bash_completion.d/git
3. git alias git config --global alias.co checkout
4. 用git 打包 git archive master | gzip > master.tar.gz 把master這個(gè)branch打包了。
5. cleanup git用得時(shí)間多了,會(huì)變慢。 那么可以用下面的命令優(yōu)化一下。 git gc - Cleanup unnecessary files and optimize the local repository git-repack - Pack unpacked objects in a repository
|
|
來(lái)自: Tornador > 《學(xué)術(shù)相關(guān)》