Git的簡單使用技巧


本部分內容來自對於《莫煩Python:Git你的版本管理顧問》的學習,網址為:https://morvanzhou.github.io/ tutorials/ others/ git/前三節內容略。

4. 記錄修改 (log & diff)

1. 修改記錄 log

$ git log

2. 查看unstaged

要查看這次還沒 add (unstaged) 的修改部分 和上個已經 commit 的文件有何不同, 我們將使用:

$ git diff

3. 查看staged--cached

你已經 add 了這次修改, 文件變成了 “可提交狀態” (staged), 我們可以在 diff 中添加參數 --cached 來查看修改。

$git add .   # add 全部修改文件

$git diff --cached

4. 查看staged & unstagedHEAD

$git diff HEAD     # staged & unstaged

 

$git diff          # unstaged

 

$git diff --cached # staged

5. 保持這次修改, 全部 add 變成 staged 狀態, commit

$git add .

$git commit -m "change 2"

5. 回到從前 (reset)

1.修改已commit的版本

有時候我們總會忘了什么, 比如已經提交了 commit 卻發現在這個 commit 中忘了附上另一個文件. 接下來我們模擬這種情況. 上節內容中, 我們最后一個 commit 是 change 2, 我們將要添加另外一個文件, 將這個修改也 commit 進 change 2. 所以我們復制 1.py 這個文件, 改名為 2.py. 並把 2.py 變成 staged, 然后使用 --amend 將這次改變合並到之前的 change 2 中。

$git add 2.py

$git commit --amend --no-edit   #"--no-edit": 不編輯, 直接合並到上一個 commit

$git log --oneline    #"--oneline": 每個 commit 內容顯示在一行

#輸出

904e1bachange 2    # 合並過的 change 2。相比未合並前,依然是change 2,但是ID號被改變。

c6762a1change 1

13be9a7create 1.py

2.reset回到add之前

3.reset回到commit之前

HEAD 是一個指針, 指引當前的狀態是在哪個 commit. 最近的一次 commit 在最右邊, 我們如果要回到過去, 就是讓 HEAD 回到過去並 reset 此時的 HEAD 到過去的位置。

$git reset --hard HEAD

我們可以查看 $ git reflog 里面最近做的所有 HEAD 的改動, 並選擇想要挽救的 commit id。 

6. 回到從前 (checkout 針對單個文件)

reset 的時候是針對整個版本庫, 回到版本庫的某個過去。不過如果我們只想回到某個文件的過去, 又該怎么辦呢?

可以使用checkout。本節介紹改寫文件checkout:

(1)回到過去

其實 checkout 最主要的用途並不是讓單個文件回到過去, 我們之后會繼續講 checkout 在分支 branch 中的應用, 這一節主要講 checkout 讓文件回到過去

我們僅僅要對 1.py 進行回到過去操作, 回到 c6762a1 change 1 這一個 commit。使 checkout +id c6762a1 + -- + 文件目錄 1.py, 我們就能將 1.py 的指針 HEAD 放在這個時刻 c6762a1:

$ git log --oneline

# 輸出

904e1ba change 2

c6762a1 change 1

13be9a7 create 1.py

---------------------

$ git checkout c6762a1-- 1.py

這時 1.py 文件的內容就變成了:

a=1

(2)改寫未來

我們在 1.py 加上一行內容 # I went back to change 1 然后 add 並 commit 1.py:

$ git add 1.py

$ git commit -m"back to change 1 and add comment for 1.py"

$ git log --oneline

 

# 輸出

47f167e back to change1 and add comment for 1.py

904e1ba change 2

c6762a1 change 1

13be9a7 create 1.py

不像 reset 時那樣, 我們的 change 2 並沒有消失, 但是 1.py 卻已經回去了過去, 並改寫了未來。

7. 分支(branch

之前我們說編輯的所有改變都是在一條主分支 master 上進行的。通常我們會把 master 當作最終的版本, 而開發新版本或者新屬性的時候, 在另外一個分支上進行, 這樣就能使開發和使用互不干擾了。

1. 使用branch 創建 dev 分支

我們之前的文件當中, 僅僅只有一條 master 分支,我們可以通過 --graph 來觀看分支:

$ git log --oneline --graph

# 輸出

* 47f167e back to change 1 and add commentfor 1.py

* 904e1ba change 2

* c6762a1 change 1

* 13be9a7 create 1.py

 

2. 使用checkout 創建 dev 分支

$ git branch dev    # 建立dev 分支

$ git branch        # 查看當前分支

# 輸出

 dev      

* master   # * 代表了當前的 HEAD 所在的分支

當我們想把 HEAD 切換去 dev 分支的時候, 我們可以用到上次說的 checkout

$ git checkout dev

# 輸出

Switched to branch 'dev'

--------------------------

$ git branch

# 輸出

* dev      # 這時 HEAD 已經被切換至 dev 分支

 master

 

刪除dev這個分支

$ git checkout master

$ git branch -d dev

3. dev 分支中修改

使用 checkout -b + 分支名, 就能直接創建和切換到新建的分支:

$ git checkout -b  dev

# 輸出

Switched to a new branch 'dev'

--------------------------

$ git branch

# 輸出

* dev      # 這時 HEAD 已經被切換至 dev 分支

 master

 

4. dev 的修改推送到master

因為當前的指針 HEAD dev 分支上,所以現在對文件夾中的文件進行修改將不會影響到master 分支。們在 1.py 上加入這一行 # I was changed in dev branch, 然后再commit:

$ git commit -am"change 3 in dev"  #"-am": add 所有改變並直接 commit

不先進行add,直接輸入上面的語句就行。使用-am,必須保證文件已經在管理庫之中。好了, 我們的開發板 dev 已經更新好了, 我們要將 dev 中的修改推送到 master ,大家就能使用到正式版中的新功能了。

1)首先我們要切換到 master, 再將 dev 推送過來.

$ git checkout master   # 切換至master 才能把其他分支合並過來

$ git merge dev         # dev merge master

$ git log --oneline --graph

 

# 輸出

* f9584f8 change 3 in dev

* 47f167e back to change 1 and add commentfor 1.py

* 904e1ba change 2

* c6762a1 change 1

* 13be9a7 create 1.py

可以看到並沒有dev上的修改: I was changed in dev branch

2)要體現分支。

$ git merge --no-ff -m "keep mergeinfo" dev         # 保留 merge 信息

$ git log --oneline --graph

# 輸出

*   c60668f keep merge info

|\ 

| * f9584f8 change 3 indev         # 這里就能看出, 我們建立過一個分支

|/ 

* 47f167e back to change 1 and add commentfor 1.py

* 904e1ba change 2

* c6762a1 change 1

* 13be9a7 create 1.py

8. merge 分支沖突

想象不僅有人在做開發版 dev 的更新, 還有人在修改 master 中的一些 bug. 當我們再 merge dev 的時候, 沖突就來了. 因為 git 不知道應該怎么處理 merge , master dev 的不同修改。

比如在:

       master 中的 1.py 加上 # edited in master.

       dev 中的 1.py 加上 # edited in dev.

在下面可以看出在 master dev 中不同的 commit:

 

# 這是 master log

* 3d7796e change 4 in master # 這一條commit dev 的不一樣

* 47f167e back to change 1 and add comment for 1.py

* 904e1ba change 2

* c6762a1 change 1

* 13be9a7 create 1.py

-----------------------------

# 這是 dev log

* f7d2e3a change 3 in dev   # 這一條 commit master 的不一樣

* 47f167e back to change 1 and add comment for 1.py

* 904e1ba change 2

* c6762a1 change 1

* 13be9a7 create 1.py

 

當我們想要 merge dev master 的時候:

$ git branch

  dev

* master

-------------------------

$ git merge dev

 

# 輸出

Auto-merging 1.py

CONFLICT (content): Merge conflict in 1.py

Automatic merge failed; fix conflicts and then commit the result.

 

git 發現的我們的 1.py master dev 上的版本是不同的, 所以提示 merge 有沖突. 具體的沖突, git 已經幫我們標記出來, 我們打開 1.py 就能看到:

a = 1

# I went back to change 1

<<<<<<< HEAD

# edited in master

=======

# edited in dev

>>>>>>> dev

所以我們只要在 1.py 中手動合並一下兩者的不同就 OK . 我們將當前 HEAD (也就是master) 中的描述 dev 中的描述合並一下。

 

a = 1

# I went back to change 1

# edited in master and dev

 

然后再 commit 現在的文件, 沖突就解決啦.

$ git commit -am "solve conflict"

 

再來看看 master log:

$ git log --oneline --graph

 

# 輸出

*   7810065 solve conflict

|\ 

| * f7d2e3a change 3 in dev    合並在一起。

* | 3d7796e change 4 in master

|/ 

* 47f167e back to change 1 and add comment for 1.py

* 904e1ba change 2

* c6762a1 change 1

* 13be9a7 create 1.py

9. rebase 分支沖突

什么是rebase?是一種更高級的合並方式,同樣是合並rebase 的做法和 merge 不一樣。

merge 不一樣。 merge 在合並的時候創建了一個新的commit. 這一點不同, 使得在共享分支中使用 rebase 變得危險。如果是共享分支的歷史被改寫。別人之前共享內容的 commit 就被你的 rebase 修改掉了。

10. 臨時修改 (stash)

不想把要改的程序和自己改進代碼的部分一起commit。這時 stash 就是我的救星了. stash 能先將我的那改進的部分放在一邊分隔開來. 再另外單獨處理老板的任務。

1.暫存修改

$ git stash

將這些改變暫時放在一邊。

2.做其它任務

建立另一個 branch 用來完成老板的任務。

3.恢復暫存

可以通過 pop 來提取這個並繼續工作了。

11. Github 在線代碼管理

1. 建立Github版本庫

Git:本地管理庫;Github:在線管理庫。添加你的一個 online 版本庫 repository時,

版本庫的名稱不一定和本地的是一樣的。

Github上的管理庫鏈接上你的本地版本庫。

2. 連接本地版本庫

打開bash,保證文件在當前的路徑下,然后輸入…orcreate a new repository on the command line中的最后兩行。

3. 推送修改


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com