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