git使用總結

來源:互聯網
上載者:User

git使用總結 git目前是最流行的代碼管理軟體,包括Linux kernel源碼和android源碼都是由git來管理。git使用起來效率高,乾淨,產生的中間檔案不會影響到代碼,比起SVN有很大優勢。目前在工作中也是用git來管理源碼,這裡簡單梳理一下使用細節和命令。在ubuntu系統中安裝gitsudo apt-get install git git-core建立統一的賬戶來管理git項目,這一點在實際中很需要,避免後期因為多使用者的修改提交而產生衝突sudo adduser gitsudo passwd git初始化倉庫mkdir projectcd projectgit init 此時在專案檔中多出.git檔案夾,通過這個來管理git add .(要求給當前項目製作一個snapshot)git commit -m " xxxxxx"此時遠程端git倉庫已經建立完畢 本地複製遠程端庫git clone git@ip:/source/destgit config --global user.name "your name"git config --global user.email  "email@xxxx"修改檔案並提交*將新增或者修改等變化的檔案添加到git的索引(index)中:git add file1 file2 將索引(index)的內容儲存到git庫中git commit 提交之前,查看修改狀態:git diff --cached或者git status 分支管理:git branch 查看分支git branch branch1(建立分支)git checkout branch1 切換到branch1分支等效於git ckeckout -b branch1git merge branch1 合并到branch1分支git branch -d branch1 刪除分支branch1,根據提示修改錯誤git branch -D branch1 強制移除 提交本地分支branch1到遠程倉庫同樣作為branch1分支git push origin branch1刪除遠程倉庫中的branch1分支git push origin :branch1在使用git push代碼到倉庫時,遇到如下錯誤:[remote rejected]master->master(branch is currently checked out)remote: error: refusing to update checked out branch: refs/heads/masterremote: error: By default, updating the current branch in a non-bare repositoryremote: error: is denied, because it will make the index and work tree inconsistent 這是由於git預設拒絕了push操作,需要進行設定,修改.git/config檔案後面添加如下代碼:[receive]denyCurrentBranch = ignore 開發人員(以下稱為本地)和伺服器(遠端)之間的交流;(以下都在本地進行操作)  git  push 遠端項目路徑 本地分支名:遠端分支名  a. 當本地有修改檔案時: 首先提交修改,輸入git commit –am “修改說明”   然後將修改的推到伺服器相對應的分支,輸入:        git push origin test:master    // 合并本地test分支到伺服器端master分支     git push origin test:test       //合并本地test分支到伺服器端test分支, (origin就是複製時在.git/config檔案中自動定義的伺服器項目路徑,請自行查看)  需要格外注意的是,git push好像不會自動合并檔案。因此,如果git push時,發生了衝突,就會被後push的檔案內容強行覆蓋,而且沒有什麼提示。  如果使用了git init初始化,則遠程倉庫的目錄下,也包含work tree,當本地倉庫向遠程倉庫push時,   如果遠程倉庫正在push的分支上(如果當時不在push的分支,就沒有問題), 那麼push後的結果不會反應在work tree上,  也即在遠程倉庫的目錄下對應的檔案還是之前的內容,必須得使用git reset --hard才能看到push後的內容  b. 當本地有建立的分支時: 首先提交新分支的修改,然後將在本地建立的分支test1推到伺服器, 輸入:    git push origin test1: 遠端分支名       // 將本地新test1分支推到伺服器,查看伺服器,此時伺服器中多了一個新分支,如果沒有輸入遠端分支名,則伺服器上的新分支名和本地分支名(test1)一樣;如果有輸入遠端分支名,則伺服器上的新分支名為輸入的分支名;  c. 刪除遠端分支:     如果:左邊的分支為空白,那麼將刪除:右邊的遠端分支,輸入:    git push origin :test   //遠端test將被刪除,但是本地還會儲存的需要格外注意的是,git push好像不會自動合并檔案。因此,如果git push時,發生了衝突,就會被後push的檔案內容強行覆蓋,而且沒有什麼提示。如果使用了git init初始化,則遠程倉庫的目錄下,也包含work tree,當本地倉庫向遠程倉庫push時,   如果遠程倉庫正在push的分支上(如果當時不push的分支,就沒有問題), 那麼push後的結果不會反應在work tree上,  也即在遠程倉庫的目錄下對應的檔案還是之前的內容,必須得使用git reset --hard才能看到push後的內容 b. 當本地有建立的分支時:首先提交新分支的修改,然後將在本地建立的分支test1推到伺服器, 輸入: git push origin test1:遠端分支名// 將本地新test1分支推到伺服器,查看伺服器,此時伺服器中多了一個新分支,如果沒有輸入遠端分支名,則伺服器上的新分支名和本地分支名(test1)一樣;如果有輸入遠端分支名,則伺服器上的新分支名為輸入的分支名; c. 刪除遠端分支:如果:左邊的分支為空白,那麼將刪除:右邊的遠端分支,輸入: git push origin :test //遠端test將被刪除,但是本地還會儲存的 git  pull 遠端項目路徑 遠端分支名:本地分支名 a. 當伺服器端有修改檔案或者補丁時,首先在伺服器端必須是提交好的: 將修改的拉到本地相對應的分支,輸入:    git pull origin test:master    // 合并伺服器端test分支到本地master分支    git pull origin test:test       //合并伺服器端test分支到本地test分支 注意:如果在合并的時候有衝突,則手動修改衝突,提交直到沒有衝突,再進行合并;  b. 當伺服器端有建立的分支時: 首先提交新分支的修改,然後將在伺服器端建立的分支test1拉到本地來, 輸入:    git pull origin test1: 本地分支名    // 將伺服器端新test1分支拉到本地,查看本地,此時本地中多了一個新分支,注意:必須輸入本地分支名,否則無法查看到(原因待查); Log查看:git loggit log -p       顯示patchgit 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 和 diffgit log --author="Author Name" 篩選特定作者的loggit log --since="2012-2-23" --before="2012-2-24" 篩選時間段git log --grep="key word" 在commit 的message中尋找關鍵字git log branch --not master 查看在branch上的,但不在master上的記錄。  git撤銷:git checkout -- filename 撤銷修改,恢複到修改前的版本git reset HEAD filename 取消暫存 檔案回到已修改未暫存的狀態 回退到指定版本,清除該版本之後所有的資訊:$ git reset --hard HEAD^(這裡可以指定commit,查詢得到)這樣將會把當前工作分支的內容回退到"HEAD^"版本。注意,這個命令不僅會把當前的修改給移除,而且還會把自"HEAD^"以後的所有"commit"給刪除(HEAD^版本本身保留為當前的HEAD),如果當前的分支是唯一的分支的話,那麼運行這個命令之後,之前"HEAD^"以後的修改將會完全丟失(當然可以通過"pull"再將之前的HEAD拉取回來,但是自己沒有提交的本地修改是無法找回來的了);另外如果在一個公用的分支上面執行這個命令將會導致其他開發人員pull的時候都進行一遍這個清除的工作,如果不加--hard選項,那麼可能當前HEAD基礎上有修改的情況導致這個命令不會成功。 回退到指定版本,並作為新版本提交上去(保留該版本之後所有的資訊):$ git revert HEAD^這樣只會把內容回退為HEAD^之前的版本(即HEAD^^),再將這樣的內容做為新的HEAD提交上去,原來的HEAD變成HEAD^(即在庫中保留HEAD^之後的版本的提交,而不像"reset"那樣完全清除)。這裡,運行之後,會開啟一個編輯視窗讓你編輯提交的log資訊,退出就直接提交了,或者"revert"命令也有不編輯提交log資訊的選項。HEAD:表示最近一次的commit。(最新版本)MERGE_HEAD:如果是merge產生的commit,那麼它表示除HEAD之外的另一個父母分支。FETCH_HEAD:使用git-fetch獲得的object和ref的資訊都儲存在這裡,這些資訊是為日後git-merge準備的。HEAD^:表示HEAD父母的資訊HEAD^^:表示HEAD父母的父母的資訊HEAD~4:表示HEAD上溯四代的資訊HEAD^1:表示HEAD的第一個父母的資訊(和HEAD^相同)HEAD^2:表示HEAD的第二個父母的資訊COMMIT_EDITMSG:最後一次commit時的提交資訊。 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.