git學習

Githtml

首先是進入相關目錄,這邊以/G/Main 爲例linux

git bash 命令以下git

cd /G/Maingithub

而後初始化目錄,命令以下bash

git init服務器

初始化完畢後,就能夠把工程拷貝進目錄了,拷貝完畢,須要添加到庫中app

命令以下函數

git add .測試

添加完畢之後,就是提交咯,命令以下fetch

git commit -m '提交備註'

若是提交前須要看下修改狀態的話,可使用命令

git status

就會顯示文件修改的狀況

==================================================================================

分支相關

新建一個分支,正常git 初始化的那個版本,就是master版本,主線版本

查看分支命令

git branch

切換分支

git checkout 分支名稱

新建分支

git checkout -b 分支名稱

或者

git branch 分支名稱

刪除分支

git branch -d 分支名 ================================================================================== 刪除文件,命令以下 git rm -r

================================================================================== 查看日誌,命令以下 git log

==================================================================================

若是在主線上有代碼更新,分支也須要同步的狀況

首先獲取到主線上代碼更新的哈希碼值,前幾位便可

能夠經過 git log獲取

而後切換在分支版本上去

命令以下

git cherry-pick <commit-id>

若是有衝突的,手動更改提交便可。

================================================================================== 主線和分支上合併

切換到主線上,使用命令 git merge 分支名稱

================================================================================== 從服務端上取代碼

git clone 服務端代碼路徑

================================================================================== 本地代碼提交到服務器端

git push origin master:test //提交本地 master 分支到服務端 test分支上 git push origin test:test   //提交本地 test 分支到服務端 test 分支上

刪除遠程分支

git push origin  :test //刪除遠程 test 分支

================================================================================== 同步服務端的代碼

有兩種方法,一種是git fetch 遠端代碼 ,而後 再調用 git merge 另外一種是git pull(git fetch 和 git merge 前後默認調用) git fetch origin master git log -p master..origin/master git merge origin/master

git pull origin master

注:這邊origin是默認遠程庫的別名 可使用git remote 查看別名

================================================================================== 當本地有修改,未提交的時候,須要回覆修改前的狀態

git clean -df  , 【git clean -dxf (刪除含.ignore內的問題)】 git reset --hard

==================================================================================

下午push的時候提示fast-forwards 後來查資料講是衝突了。 解決方式:

git pull origin xxxx

發現衝突,fixed,

提交,

push

ok!

================================================================================== git 刪除本地分支

git branch -d 本地分支名稱

================================================================================== git 查看遠程分支

git branch -a git remote show origin  

 

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 list  stash@{0}: WIP on 3.0: 02f8c6a Linux 3.0  stash@{1}: WIP on pci-fix: 79eefa4 Optimize the resource overlap check  stash@{2}: WIP on pci-fix: 02f8c6a Linux 3.0  stash@{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.0  v3.0-rc1  v3.0-rc2  v3.0-rc3  v3.0-rc4  v3.0-rc5  v3.0-rc6  v3.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

相關文章
相關標籤/搜索