Git 常用命令


 


--------------------------------------------------------------
gitbegin

git status 查看倉庫當前的狀態
git diff 查看具體修改的內容

丟棄本地新建文件
git clean -df

丟棄本地修改文件
本地修改文件,但是沒有加到緩存區
git checkout -- file可以丟棄工作區的某一個修改的文件
git checkout . 丟棄工作區所有修改的文件

丟棄本地修改文件與新建文件
git checkout . && git clean -df

本地修改文件,且加到緩存區 git reset HEAD file 可以把暫存區的修改撤銷掉(unstage),重新放回工作區,不寫具體file就是把所有的修改文件都撤銷掉
git reset HEAD

強制把遠程倉庫的代碼覆蓋掉本地
git reset --hard origin/master

修改文件后提交的步驟
git add .
git commit -m 'xxxxx'
git add .
git commit -m 'xxxxx'
git add .
git commit -m 'xxxxx'
git push

git commit -a -m 'xxxxx' 也可以一句話直接將所有文件提交到倉庫,同上面兩步, add和commit

git add -u 可以用於刪除文件時候同步到遠程庫

git log 查看當前倉庫的歷史版本
git log --pretty=oneline 查看當前倉庫的歷史版本(將信息展示成一行)
git log --pretty=oneline --abbrev-commit 簡寫commit id的形式展示出來
git log --graph 命令可以看到分支合並圖。

想將test分支中的C2 commit合並到master分支,丟棄C3的修改。
直接merge會把C3也合並進去,這時用git cherry-pick可以解決問題

先用git log查看,C2 commit的id,復制下來
git checkout 到master分支下
git cherry-pick <C2_id>

如果出現沖突,

先解決沖突
git add 將解決了沖突的文件添加到暫存區
git cherry-pick --continue就行

git reset –-soft <commit_id>:回退到某個版本,只回退了commit的信息,不會恢復到index file一級。如果還要提交,直接commit即可;
git reset -–hard <commit_id>:徹底回退到某個版本,本地的源碼也會變為上一個版本的內容,撤銷的commit中所包含的更改被沖掉;

git reset --soft HEAD~3 最后三個commit


git reset --hard 3628164(這串是commit 時候的id) 回退都某一個歷史版本,id不必寫全,git會自動找,但是要唯一才行
git update-index --assume-unchanged 的真正用法是這樣的:
你正在修改一個巨大的文件,你先對其 git update-index --assume-unchanged,這樣 Git 暫時不會理睬你對文件做的修改;
當你的工作告一段落決定可以提交的時候,重置改標識:git update-index --no-assume-unchanged,於是 Git 只需要做一次更新,這是完全可以接受的了;
提交+推送。
git update-index --assume-unchanged /path/to/file #忽略跟蹤
git update-index --no-assume-unchanged /path/to/file #恢復跟蹤

在git中如果想忽略掉某個文件,不讓這個文件提交到版本庫中,可以使用修改 .gitignore 文件的方法。這個文件每一行保存了一個匹配的規則例如:
# 此為注釋 – 將被 Git 忽略
*.a # 忽略所有 .a 結尾的文件
!lib.a # 但 lib.a 除外
/TODO # 僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO
build/ # 忽略 build/ 目錄下的所有文件

doc/*.txt # 會忽略 doc/notes.txt 但不包括 doc/server/arch.txt
這樣設置了以后 所有的 .pyc 文件都不會添加到版本庫中去。
另外 git 提供了一個全局的 .gitignore,你可以在你的用戶目錄下創建 ~/.gitignoreglobal 文件,以同樣的規則來划定哪些文件是不需要版本控制的。
需要執行 git config --global core.excludesfile ~/.gitignoreglobal來使得它生效。
其他的一些過濾條件
* ?:代表任意的一個字符
* *:代表任意數目的字符
* {!ab}:必須不是此類型
* {ab,bb,cx}:代表ab,bb,cx中任一類型即可
* [abc]:代表a,b,c中任一字符即可

* [ ^abc]:代表必須不是a,b,c中任一字符
由於git不會加入空目錄,所以下面做法會導致tmp不會存在 tmp/* //忽略tmp文件夾所有文件
改下方法,在tmp下也加一個.gitignore,內容為
*
!.gitignore
還有一種情況,就是已經commit了,再加入gitignore是無效的,所以需要刪除下緩存
git rm -r --cached ignore_file
當我們需要刪除暫存區或分支上的文件, 同時工作區也不需要這個文件了, 可以使用
git rm file_path

當我們需要刪除暫存區或分支上的文件, 但本地又需要使用, 只是不希望這個文件被版本控制, 可以使用
git rm --cached file_path

注意: .gitignore只能忽略那些原來沒有被track的文件,如果某些文件已經被納入了版本管理中,則修改.gitignore是無效的。
正確的做法是在每個clone下來的倉庫中手動設置不要檢查特定文件的更改情況。
git update-index --assume-unchanged PATH 在PATH處輸入要忽略的文件。

另外 git 還提供了另一種 exclude 的方式來做同樣的事情,不同的是 .gitignore 這個文件本身會提交到版本庫中去。用來保存的是公共的需要排除的文件。而 .git/info/exclude 這里設置的則是你自己本地需要排除的文件。 他不會影響到其他人。也不會提交到版本庫中去。

.gitignore 還有個有意思的小功能, 一個空的 .gitignore 文件 可以當作是一個 placeholder 。當你需要為項目創建一個空的 log 目錄時, 這就變的很有用。 你可以創建一個 log 目錄 在里面放置一個空的 .gitignore 文件。這樣當你 clone 這個 repo 的時候 git 會自動的創建好一個空的 log 目錄了。

如果即將開發一個新項目這時候遠程沒有倉庫,這就需要在本地新建一個git倉庫
1、git init命令把這個目錄變成Git可以管理的倉庫
2、git remote add origin http://192.168.0.170:4096/gittest.git 添加遠程倉庫地址
3、git push -u origin master 把本地庫的內容推送到遠程,用git push命令,實際上是把當前分支master推送到遠程。
由於遠程庫是空的,我們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以后的推送或者拉取時就可以簡化命令。

git stash 可以把當前工作現場“儲藏”起來,等以后恢復現場后繼續工作
git stash list 查看所有保存的工作場景
需要恢復一下,有兩個辦法:
一是用git stash apply恢復,但是恢復后,stash內容並不刪除,你需要用git stash drop來刪除;
另一種方式是用git stash pop,恢復的同時把stash內容也刪了
git stash apply stash@{0}
git stash pop stash@{0}


git tag <name>用於新建一個標簽,默認為HEAD,也可以指定一個commit id;
git tag -a <tagname> -m "blablabla..."可以指定標簽信息
git show <tagname>查看標簽信息
git tag -d v0.1 刪除本地某一個tag標簽
git push origin <tagname> 將某一個本地標簽推送到遠程
git push origin --tags 將本地所以tag標簽推送到遠程
git push origin :refs/tags/<tagname> 刪除某一個遠程tag標簽


命令git tag可以查看所有標簽。

如果開發已有git倉庫的項目
第一步:git clone
git clone url filename(此項非必選,默認本地文件與遠程地址相同)

第二步:git remote
為了便於管理,Git要求每個遠程主機都必須指定一個主機名。git remote命令就用於管理主機名。
不帶選項的時候,git remote命令列出所有遠程主機。
git remote
使用-v選項,可以參看遠程主機的網址。
git remote -v

輸入 touch .gitignore ,生成“.gitignore”文件。

origin git@github.com:jquery/jquery.git(fetch)
origin git@github.com:jquery/jquery.git(push)
上面命令表示,當前只有一台遠程主機,叫做origin,以及它的網址。
克隆版本庫的時候,所使用的遠程主機自動被Git命名為origin。如果想用其他的主機名,需要用git clone命令的-o選項指定。
git clone -o jQuery https://github.com/jquery/jquery.git
上面命令表示,克隆的時候,指定遠程主機叫做jQuery。
【git remote show <主機名> 】命令加上主機名,可以查看該主機的詳細信息。
【git remote add <主機名> <網址>】命令用於添加遠程主機。
【git remote rm <主機名>】命令用於刪除遠程主機。
【git remote rename <原主機名> <新主機名>】命令用於遠程主機的改名。
git remote prune origin 將遠程所有分支同步到本地
git remote set-url --add origin <url2> 往origin庫里添加url2 以后再push的時候,就可以同時push多個庫了

多處提交config
[remote "origin"]
url = git@git.oschina.net:jiaoshou/reacttest.git
fetch = +refs/heads/*:refs/remotes/origin/*
url = git@git.coding.net:jsser/reacttest.git
[branch "master"]
remote = origin
merge = refs/heads/master


第三步:git fetch
git fetch <遠程主機名>
上面命令將某個遠程主機的更新,全部取回本地。
git fetch命令通常用來查看其他人的進程,因為它取回的代碼對你本地的開發代碼沒有影響。
默認情況下,git fetch取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名。
git fetch <遠程主機名> <分支名>
比如,取回origin主機的master分支。
git fetch origin master
所取回的更新,在本地主機上要用"遠程主機名/分支名"的形式讀取。比如origin主機的master,就要用origin/master讀取。
git branch 查看當前所在分支
git branch命令的-r選項,可以用來查看遠程所有分支,-a選項查看本地和遠程的所有分支。
git branch -r
git branch -a
上面命令表示,本地主機的當前分支是master,遠程分支是origin/master。
取回遠程主機的更新以后,可以在它的基礎上,使用git checkout命令創建一個新的分支。
git checkout -b dev origin/master
上面命令表示,在origin/master的基礎上,創建一個dev新分支,並切換分到新建dev分支。
切換分支 git checkout xxx
刪除本地分支 git branch -d xxxxx
進行merge操作執行,需要先將本地修改進行commit操作
git merge dev 將本地dev分支合並到當前分支
git merge --squash dev 將本地dev分支合並到當前分支(不顯示dev分支上的歷史版本),產生一次新的commit
git merge origin/dev 將遠程dev分支合並到當前分支
此外,也可以使用git merge命令或者git rebase命令,在本地分支上合並遠程分支。
git merge origin/master 或者
git rebase origin/master
上面命令表示在當前分支上,合並origin/master。
/*
使用下面的關系區別這兩個操作:
git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase
現在來看看git merge和git rebase的區別。
假如你從origin版本C 創建個E分支,commit了3次修改,當你需要push的時候,另外一個人origin的C已經更新成D,這時候E不應該提交,應該提交后會產生沖突,這時候有兩種方法可以解決:
1、git merge
用git pull命令把"origin"分支上的修改pull下來與本地提交合並(merge)成版本M,但這樣會形成圖中的菱形,讓人很困惑。
2、git rebase
創建一個新的提交R,R的文件內容和上面M的一樣,但我們將E提交廢除,當它不存在(圖中用虛線表示)。由於這種刪除,小李不應該push其他的repository.rebase的好處是避免了菱形的產生,保持提交曲線為直線,讓大家易於理解。
在rebase的過程中,有時也會有conflict(沖突),這時Git會停止rebase並讓用戶去解決沖突,解決完沖突后,用git add命令去更新這些內容,然后不用執行git-commit,直接執行git rebase --continue,這樣git會繼續apply余下的補丁。git rebase --skip,這個可以跳過當前沖突,進行下一個補丁。
在任何時候,都可以用git rebase --abort參數來終止rebase的行動,並且mywork分支會回到rebase開始前的狀態。
*/


第四步:git pull
git pull命令的作用是,取回遠程主機某個分支的更新,再與本地的指定分支合並。它的完整格式稍稍有點復雜。
git pull <遠程主機名> <遠程分支名>:<本地分支名>
比如,取回origin主機的next分支,與本地的master分支合並,需要寫成下面這樣。
git pull origin next:master
如果遠程分支是與當前分支合並,則冒號后面的部分可以省略。
git pull origin next
上面命令表示,取回origin/next分支,再與當前分支合並。實質上,這等同於先做git fetch,再做git merge。
git fetch origin
git merge origin/next
在某些場合,Git會自動在本地分支與遠程分支之間,建立一種追蹤關系(tracking)。比如,在git clone的時候,所有本地分支默認與遠程主機的同名分支,建立追蹤關系,也就是說,本地的master分支自動"追蹤"origin/master分支。
Git也允許手動建立追蹤關系。
git branch --set-upstream master origin/next
上面命令指定master分支追蹤origin/next分支。
如果當前分支與遠程分支存在追蹤關系,git pull就可以省略遠程分支名。
git pull origin
上面命令表示,本地的當前分支自動與對應的origin主機"追蹤分支"(remote-tracking branch)進行合並。
如果當前分支只有一個追蹤分支,連遠程主機名都可以省略。
git pull
上面命令表示,當前分支自動與唯一一個追蹤分支進行合並。
如果合並需要采用rebase模式,可以使用--rebase選項。
git pull --rebase <遠程主機名> <遠程分支名>:<本地分支名>
如果遠程主機刪除了某個分支,默認情況下,git pull不會在拉取遠程分支的時候,刪除對應的本地分支。這是為了防止,由於其他人操作了遠程主機,導致git pull不知不覺刪除了本地分支。
但是,你可以改變這個行為,加上參數-p就會在本地刪除遠程已經刪除的分支。
git pull -p 等同於下面的命令
git fetch --prune origin
git fetch -p

第五步:git push
git push命令用於將本地分支的更新,推送到遠程主機。它的格式與git pull命令相仿。
git push <遠程主機名> <本地分支名>:<遠程分支名>
注意,分支推送順序的寫法是<來源地>:<目的地>,所以git pull是<遠程分支>:<本地分支>,而git push是<本地分支>:<遠程分支>。
如果省略遠程分支名,則表示將本地分支推送與之存在"追蹤關系"的遠程分支(通常兩者同名),如果該遠程分支不存在,則會被新建。
git push origin master
上面命令表示,將本地的master分支推送到origin主機的master分支。如果后者不存在,則會被新建。
如果省略本地分支名,則表示刪除指定的遠程分支,因為這等同於推送一個空的本地分支到遠程分支。
git push origin :master 等同於git push origin --delete master
上面命令表示刪除origin主機的master分支。
如果當前分支與遠程分支之間存在追蹤關系,則本地分支和遠程分支都可以省略。
git push origin
上面命令表示,將當前分支推送到origin主機的對應分支。
如果當前分支只有一個追蹤分支,那么主機名都可以省略。
git push
如果當前分支與多個主機存在追蹤關系,則可以使用-u選項指定一個默認主機,這樣后面就可以不加任何參數使用git push。
git push -u origin master
上面命令將本地的master分支推送到origin主機,同時指定origin為默認主機,后面就可以不加任何參數使用git push了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM