天天看點

GIT學習筆記.

Git 的工作就是建立和儲存你項目的快照及與之後的快照進行對比

Git 與 SVN 差別

GIT不僅僅是個版本控制系統,它也是個内容管理系統(CMS),工作管理系統等。

如果你是一個具有使用SVN背景的人,你需要做一定的思想轉換,來适應GIT提供的一些概念和特征。

Git 與 SVN 差別點:

1、GIT是分布式的,SVN不是:這是GIT和其它非分布式的版本控制系統,例如SVN,CVS等,最核心的差別。

2、GIT把内容按中繼資料方式存儲,而SVN是按檔案:所有的資源控制系統都是把檔案的元資訊隐藏在一個類似.svn,.cvs等的檔案夾裡。

3、GIT分支和SVN的分支不同:分支在SVN中一點不特别,就是版本庫中的另外的一個目錄。

4、GIT沒有一個全局的版本号,而SVN有:目前為止這是跟SVN相比GIT缺少的最大的一個特征。

5、GIT的内容完整性要優于SVN:GIT的内容存儲使用的是SHA-1雜湊演算法。這能確定代碼内容的完整性,確定在遇到磁盤故障和網絡問題時降低對版本庫的破壞。

一般工作流程如下:

  • 克隆 Git 資源作為工作目錄。
  • 在克隆的資源上添加或修改檔案。
  • 如果其他人修改了,你可以更新資源。
  • 在送出前檢視修改。
  • 送出修改。
  • 在修改完成後,如果發現錯誤,可以撤回送出并再次修改并送出。
GIT學習筆記.
GIT學習筆記.

常用指令:

         git add    暫存區的目錄樹被更新,将工作區的目錄寫入暫存區

         git add .  添加目前項目的所有檔案

         git add –i [path]   檢視這個目錄下所有修改和删除但沒有送出的檔案。執行這個指令

          git commit –m ‘送出代碼并注釋’:将暫存區的目錄樹送出到版本庫中

          git commit –am ‘第一次版本修改’:直接将工作區的代碼送出到版本庫

          git remote 檢視目前遠端庫 

          git remote rm [别名] :删除遠端倉庫

          git clone [url]  複制對應位址的倉庫下來

          git remote –v  可以看到每個别名的實際連結位址

          git pull   拉取最新的代碼,若有沖突,則修改沖突的檔案 ,不加參數的話 隻是針對目前分支與遠端自己分支進行同步更新

          git push   拉最新代碼推到代碼倉庫。

          git pull origin next:master :取回origin主機的next分支,與本地的master分支合并。

          git push origin local_branch:remote_branch :将本地分支推送到遠端倉庫

          git reset head:暫存區的目錄樹被版本庫中的代碼重寫,但是工作區不受影響

          git reset --hard:将版本回退到上一次送出的版本

          git rm –cached<file>  會直接從暫存區删除檔案,工作區則不做出改變

          git rm file  會将檔案從緩存區和工作區删除

          git reset --soft HEAD^  送出從 commit 狀态退回到 add 狀态

          git checkout--<file>  将暫存區的代碼寫入工作區(可能會誤删工作區未送出的代碼)

          git checked HEAD:将版本庫中的所有代碼替代工作區的代碼,同時更新暫存區的代碼

          touch:建立一個新的檔案

          ls:顯示目前目錄下的所有檔案

          git status –s:檢視項目的目前狀态

          git diff  顯示你上次送出更新後的更改或者寫入緩存的改動

          git config --global user.name '使用者名':設定使用者名

          git config --global user.email 郵箱位址:設定郵箱

密鑰管理:

1、cd ~/.ssh  是否存在主目錄密鑰的目錄

2、ls 看下是否存在密鑰檔案

3、ssh-keygen -t rsa  生成密鑰

4、cat ~/.ssh/id_rsa.pub 檢視公鑰

5、添加公鑰到遠端倉庫

GIT學習筆記.

檔案的幾種狀态:

A:工作區中存在,送出到暫存區,且工作區和暫存區的代碼一緻

AM:檔案送出到暫存區後又有改動

AD:暫存區中有檔案,而工作區中沒有

??:代碼值存在工作區,未送出到暫存區

M:送出到版本庫後代碼仍然有改動、

分支管理:

建立分支:git branch (branchname)

切換分支:git checkout(branchname)

合并分支到目前分支上(在更新過程中也行會因為沖突出現報錯,本地解決沖突後送出代碼):git merge (branchname)

合并分支的某個檔案到目前分支上: git checkout --patch A分支 f 檔案  

建立新分支并立即到該目錄下:git checkout –b(branchname)

删除分支:git branch –d(branchname)

重命名分支:git branch -m devel develop

(建立分支用來備份代碼)

檢視遠端分支:git branch –a

删除遠端分支:git push origin --delete (branchname)

強推覆寫代碼:git push -f

推送本地分支到遠端:git push origin (branchname)

跟蹤遠端分支并推送:git push --set-upstream origin (branchname)

重命名本地分支:git branch -m (old) (new)

檢視送出曆史:  

列出曆史記錄:git log

列出前兩次送出記錄:git log -2

檢視某個作者的日志: git log --author="John"

曆史記錄簡潔版本:git log --oneline --decorate

什麼時候出現了分支、合并:git log –-oneline –grash

逆向顯示所有日志:git log --reverse --oneline

回退到某個版本:git reset --hard 版本号

回退到某個版本并儲存工作區修改:git reset --soft 版本号

删除未監視的檔案untracked files

# 删除 untracked files

git clean -f

# 連 untracked 的目錄也一起删掉

git clean -fd

# 連 gitignore 的untrack 檔案/目錄也一起删掉 (慎用,一般這個是用來删掉編譯出來的 .o之類的檔案用的)

git clean -xfd

# 在用上述 git clean 前,牆裂建議加上 -n 參數來先看看會删掉哪些檔案,防止重要檔案被誤删

git clean -nxfd

git clean -nf

git clean -nfd

GIT 标簽(tag)操作

      # 檢視标簽

        git tag 或者 git tag -l

       # 檢視标簽版本資訊

        git show [tagname]

        # 打标簽(目前分支的目前版本)

        git tag -a 'V1.0.0' -m '1.0版本'

        # 打标簽(目前分支的某個曆史送出版本)

        git tag -a 'V1.0.0' 4f96b167c52a858492bf65be3635d970727c0316 -m '1.0版本' 

        --參數a即annotated的縮寫,指定标簽類型,後附标簽名。參數m指定标簽說明,說明資訊會儲存在标簽對象中。

        # 删除标簽

         git tag -d V1.0.0

         git push origin :refs/tags/v1.01    # 删除遠端标簽(就像git push origin :branch_1 可以删除遠端倉庫的分支branch_1一樣, 冒号前為空表示删除遠端倉庫的tag)

        # 切換标簽

        git checkout [tagname]

        # 标簽釋出

       git push origin [tagname]

       git push origin tags    # 将本地的标簽一次性送出到 git 伺服器

GIT cherry-pick 用法

cherry-pick:會重演某些commit, 即把某些commit的更改重新執行一遍。

案例:比如 A 是一個項目的版本分支,B 是另一個項目的版本分支。這時候想要把 B分支 的某個功能合并到 A 分支上,又不想全部合并,就要用到 cherry-pick 了。

用法:git cherry-pick [某個送出的id号]

tips:id 号可以通過 git log -2 獲得,擷取上兩次的送出記錄。

cherry-pick 不僅可以用在不同分支之間, 還可以用在同一個分支上。

同一分支用法也是一樣的, 同一分支使用情形:比如說你在某一個向某個分支中添加了一個功能, 後來處于某種原因把它給删除了,然而後來某一天你又要添加上這個功能了, 這時候就可以使用cherry-pick把添加那個功能的commit, 再重演一遍.

GIT解決 pull 沖突情況

沖突情況:本地進行了修改,想要 push 或 pull  的時候,别人已經送出,導緻内容沖突,push 或者 pull 失敗。

解決方法1(常見):

利用一些工具,比如 小烏龜、IDEA 等,打開沖突的檔案。先要了解,沖突的産生是因為你和别人修改了同一行的代碼,導緻 git 無法識别到底認可誰的代碼,導緻沖突。是以,解決沖突的途徑無非三種:要你的代碼;要他的代碼;你們兩個的代碼都要!之後,把修正後的代碼。重新送出。然後再 pull 或者 push 就好了。

解決方法2:

通過git stash

 git stash

 git pull

 git stash pop

通過git stash将工作區恢複到上次送出的内容,同時備份本地所做的修改,之後就可以正常git pull了,git pull完成後,執行git stash pop将之前本地做的修改應用到目前工作區。

git stash: 備份目前的工作區的内容,從最近的一次送出中讀取相關内容,讓工作區保證和上次送出的内容一緻。同時,将目前的工作區内容儲存到Git棧中。

git stash pop: 從Git棧中讀取最近一次儲存的内容,恢複工作區的相關内容。由于可能存在多個Stash的内容,是以用棧來管理,pop會從最近的一個stash中讀取内容并恢複。

git stash list: 顯示Git棧内的所有備份,可以利用這個清單來決定從那個地方恢複。

git stash clear: 清空Git棧。此時使用gitg等圖形化工具會發現,原來stash的哪些節點都消失了。

解決方法3:

放棄本地修改

git reset --hard

git pull