標籤:

Git 使用的簡單匯總

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" 設置alias,這樣lol就是自己新的命令了。

2.基本使用

1.顯示當前的配置信息

git config --list

2. 創建repo

從別的地方獲取

git clone git://git.kernel.org/pub/scm/git/git.git

自己建立

mkdir test

cd test

git init

3. 顯示狀態

git status

4. commit

git add file.1 file.2 先增加文件,增加到index中。這樣commit的時候才知道要commit哪些文件。

或者

git add -p 用來interactively選擇哪些改變需要被commit

git commit -m "log message"

或者

git commit -a 自動檢查應該commit什麼文件。如果是新增的文件,仍然要使用git add來添加。

5. 顯示以前的工作

git log 輸出格式

git log

git log -p 顯示patch

git log --stat 顯示改動的一個總結

git log --graph 只顯示當前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" 按照指定的格式輸出。

關於--pretty的其他選項和具體的format格式,參考 git log --help中PRETTY FORMAT這部分。

git log --follow file.c

這個功能很有意思,尤其是當file.c被移動後。

通常我們會移動某個文件到某個目錄下。如果這麼做,git log是不能顯示目錄移動前的記錄的。

那就加上 --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" 篩選時間段

git log --grep="key word" 在commit 的message中查找關鍵字

git log branch --not master 查看在branch上的,但不在master上的記錄。

git log -S"func_name" 查找某個字元出現,或者移出的commit。 比如可以查找一個函數是什麼時候添加,或者刪除的。

git show sha1 這個sha1是每個commit的sha1,這樣顯示某個commit的完全信息,包括diff

6. 撤銷改動

git checkout -- file.1

撤銷了file.1的這次改動。只是撤銷了沒有staged的改動.

中間的 -- 表明了這是一個文件 而不是一個branch的名字

git reset --hard HEAD

撤銷了所有沒有commit的改動,包括了stage的和沒有stage的。

這條命令的結果一樣

git checkout HEAD file.1

包括了staged 和沒有staged的都會清除。

有時候我們發現,之前做個一個commit有問題,不想要,想要去掉。

git revert HEAD 自動得重新做一個commit,將最後一次的commit返回回來。

git revert HEAD^ 自動得重新做一個commit,將最後第二次的commit 返回回來。

7. 刪除一個commit

git reset --hard HEAD~1

刪除了最近的commit

8. 修改最近的一個commit

git commit --amend

7.顯示所做的改動

git diff

顯示所有的改動。 沒有add到index中的。

git diff --staged或者 git diff --cached

顯示staged改動,也就是add的東東,也就是將要commit的東東。

git diff commit1 commit2

顯示這兩個commit之間的變動, 從commit1到commit2的變動。

git diff commit1..commit2

兩個點,效果跟上面的一樣

git diff commit1...commit2

三個點,表示的是發生在commit2分支,一直到commit1和commit2共同父親的變化。

git blame -C file1.c

顯示文件具體的改動。。。。恩,好像是用來找是誰的錯?

git blame -Ln,m file1.c

查看n,m兩行間的改動。

git blame commit1~1 -Ln,m file1.c

查看commit1版本前的改動. 追查之前的log。

git blame commit1~1 -Ln,m -- old/file.c

如果這個文件被重命名過,或者移動過位置,就要輸入舊的文件的名字。

而且一定要加上 -- , 一定。

8. 刪除某個文件

git rm file-name

從庫和當前的working directory中刪掉這個文件

git rm --cached file-name

只從庫中刪除,保留當前的本地文件。

9. 重命名一個文件

git mv file file-new

10. 應用patch

git apply patch-file

這樣做從patch-file中應用這個patch。 效果和patch命令類似。

但是好處是,git apply要麼成功,要麼不成功。不想patch,有可能有部分的patch打上了,但是有的沒有打上。

git apply後,並沒有自動生成一個commit.

git apply --check 可以用來檢測這個patch 是不是會產生衝突或者失敗。

git am patch-file

這是專門為git 設計的命令。 patch-file是通過git format-patch 生成的。

其中包含了作者信息和簡單描述。

git am後,會自動的生成一個commit.

git am --resolved

git am 過程中可能會有conflict. 如過遇到conflict, 那就需要手動修改code, git add 後

用git am --resolved

11. git 製作patch

具體步驟寫在了 http://blog.csdn.net/richardysteven/article/details/6701156

3. commit range

在git中,我們經常需要制定一個commit的範圍,比如git log中,可以顯示某範圍內的改動。

除了man gitrevisions, 在這個網站上也有不過的描述,尤其是對 double dot 和 triple dot

http://git-scm.com/book/ch6-1.html

http://stackoverflow.com/questions/462974/whats-the-difference-between-and-in-git-commit-ranges

而且這種語法,在git log和git diff兩種情況下,有不同的意義.

在git log中,

git log ^r1 r2 表示顯示從r2到root,但是去掉r1到root中和r2到root有重複的。

這個也可以表示為 git log r1..r2.

git log r1...r2 表示 顯示從r1到root, r2到root,但是去掉他們共有的部分。

我這樣理解, 前一種顯示的是樹上的一個分支。而後一種顯示了兩個分支。

在git diff中

git diff目的是比較兩個commit之間的區別。

git diff A B 和 git diff A..B 是一樣的,就是顯示這兩個之間的區別。

git diff A...B 和 git diff $(git-merge-base A B) B一樣。 就是顯示 在B這個分支上,做了什麼改動。

有時候這個命令是,git merge-base A B

在一個branch上,但不在另一個branch上

git log local_copy ^kernel

這樣可以再merge前,看看都有哪些東西要commit.

這個命令用來看,在local_copy branch上,但是不在kernel branch上的。

4. Branch

1. 顯示branch

git branch

git branch -v 顯示詳細點的信息

git branch --merged

2. 創建branch

git branch testing

或者

git checkout -b new_brach

這樣新建並且切換到了new_brach上

還有一種創建branch的辦法是

git branch branch_name b42294309188d57bf3398ed35660170a237d8c0a

注意,這後面這一長串的就是每個commit的sha1碼。

3. 切換到某個branch

git checkout testing

4. 圖形化顯示branch信息

gitk

gitk --all

5. merge

先轉到要merge到的branch,如

git checkout master

一般都會merge到master上。

然後調用

git merge testing

這樣就把testing branch上的改動merge過來了。

6. 刪除branch

好了,這個branch不用了,刪掉吧

git branch -d testing

7. 處理conflict

在merge的過程中一般會遇到conflict.

先用git status查看哪些文件產生的衝突。

可以逐一修改文件,也可以用git mergetool 來進行修改。

當所有的都修改好, 使用git commit。

8。 查看有哪些branch merge進來了,哪些沒有

git branch --merged

git branch --no-merged

比如說我們checkout 到 master,用--no-merged 可以看到還有哪個branch的改動沒有到master上。

5. Stash

git stash 用來備份當前工作區的內容。 從最近的一次提交中讀取相關內容,讓工作區保證和上次提交的內容一致。

可以多次使用git stash來保存當前的修改。

git list可以看到一共保存了多少次。

linux-2.6$ git stash liststash@{0}: WIP on 3.0: 02f8c6a Linux 3.0stash@{1}: WIP on pci-fix: 79eefa4 Optimize the resource overlap checkstash@{2}: WIP on pci-fix: 02f8c6a Linux 3.0stash@{3}: WIP on 3.0: 02f8c6a Linux 3.0

git stash save "name"

git stash

這兩個都是保存當前的改動, 如果有name則可以添加一個方便辨識的標籤。

git stash apply 用來恢復最近一次的修改。

git stash apply stash@{1}來恢復指定的修改。

git stash pop stash@{1} 的作用和git stash apply類似。

git stash pop 會從stash棧中移除某個記錄,而git stash apply不會。

git stash clear 清空棧。

6. Tag

1. 顯示tag

git tag 顯示所有的tag

匹配顯示

$ git tag -l v3.0*v3.0v3.0-rc1v3.0-rc2v3.0-rc3v3.0-rc4v3.0-rc5v3.0-rc6v3.0-rc7

2. 顯示某個tag的詳細信息

git show v3.0

3. 創建tag

git tag -a v1.4 -m "my version 1.4"

git tag -s v1.5 -m "my version 1.5"

這個將會加上pgp的簽名

對於一個-s的tag, 你可以

git tag -v v1.5

來驗證這個tag, 當然你需要有對方的PGP公鑰。

git tag v1.4-lw

這個是輕量級的tag。

git tag -a v1.2 SHA

對某個指定的SHA打tag,默認是HEAD

git push origin v1.2

git push origin --tags

默認情況下是不會將tag的信息送到遠端的。

第一的命令將某個指定的tag送到遠端。

第二個命令將所有的tag送到遠端。

7. Remote Repository

https://github.com/ 這個網上可以提供建立一個免費的git的repo

remote repo是用來多個人合作的。恩。。。,比較高級。

顯示remote repo的信息

git remote

git remote -v

git remote show origin

添加別的remote 庫

git remote add localname URL

也就是用這個localname 來代表URL

然後就可以從remote中下載代碼

git fetch localname

默認glone後local的HEAD是track在origin/master上的,

所以如果你想要work on別的branch,需要先在本地建立一個branch

git branch --track feature origin/feature

這個意思是本地有個叫feature的branch,這個是track origin/feature的。

查看remote的情況

git remote show origin

上傳changes,如果你有許可權,你可以上傳自己的更新到remote

git push origin master

意思是push到 origin這個遠端樹的master 分支上

git push origin :master

是刪除remote的分支

下載別的更新?

git pull

下載了更新就直接merge了

當本地的git倉庫更新後,我們需要與遠端server上的倉庫同步。

一般這麼做

git fetch 將同步一下狀態

git fetch -p 可以清空遠端已經不用的分支

git branch -v 可以看到本地倉庫中分支的狀態。

git branch -av 可以看到遠端和本地分支的狀態

git checkout branchname 換到你想要更新的local branch上

git rebase origin/branchname 這樣可以將本地做的commit 取下,並重新apply到最新的地方。

8. Some Tips

1. 假如編輯到了某個版本,發現某個功能不起作用了,或者有bug了。但是自己知道之前的某個版本是好的。

git bisect start

git bisect bad 現在這個版本是壞的

git bisect good good_commit good_commit這個版本是好的

接下來編譯,測試。 如果是好的

git bisect good

如果還是不好

git bisect bad

這樣git都會給你輸出某個中間的版本讓你繼續測試。

找到了錯誤,用

git bisect reset 恢復到原先的版本。

2. git 命令在bash中自動補全

http://progit.org/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這個branch打包了。

5. cleanup

git用得時間多了,會變慢。 那麼可以用下面的命令優化一下。

git gc - Cleanup unnecessary files and optimize the local repository

git-repack - Pack unpacked objects in a repository


推薦閱讀:

簡單生活,簡單快樂
人這一生,有夢想,不難,要逆風而飛,絕不簡單
找不著北:你以為很簡單?
神煞:最簡單的論命法,神煞舉例:300多種專有名詞
男士冬季最簡單實用的穿搭,絕壁不坑你!

TAG:簡單 |