1. 程式人生 > >Git 學習筆記

Git 學習筆記

過去 git reset new val [] hello reset 初始 using

1, git init 初始化
  E:\MyProject>git init
  Initialized empty Git repository in E:/MyProject/.git/
2,git add 添加文件到暫存區
  E:\MyProject>git add README.md
3,git commit -m "備註" 提交到倉庫
  E:\MyProject>git commit -m "add a readme file"
  [master (root-commit) 5601acf] add a readme file
  1 file changed, 1 insertion(+)


  create mode 100644 README.md
4,git status 查看倉庫狀態
  E:\MyProject>git status
  On branch master
  Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

  modified: README.md

  no changes added to commit (use "git add" and/or "git commit -a")
5,git reset HEAD~ 回撤
  E:\MyProject>git reset HEAD~
  Unstaged changes after reset:
  M LICENSE.txt
  reset 命令的選項
  git rest -- mixed HEAD~ (默認)
  ---移動HEAD的指向,將其指向上一個快照
  ---將HEAD移動後指向的快照回滾到暫存區域
  git rest -- soft HEAD~
  ---移動HEAD的指向,將其指向上一個快照(相當於撤回上一個提交)


  git rest --hard HEAD~
  ---移動HEAD的指向,將其指向上一個快照
  ---將HEAD移動後指向的快照回滾到暫存區域
  ---將暫存區域的文件還原到工作目錄
  git reset 版本快照的ID號
  ---回滾到指定ID號
  E:\MyProject>git log --------->提交日誌
  commit f4747938e0ec1634519af4491e68a0e72135c3be (HEAD -> master)
  Author: chne <[email protected]>
  Date: Wed Jun 21 17:04:12 2017 +0800

  add LICENSE.txt file

  commit 5601acfa5e9f5abe4039cb8a8ff7a0a4c358484d
  Author: chne <[email protected]>
  Date: Wed Jun 21 16:49:51 2017 +0800

  add a readme file

  E:\MyProject>git reset 5601ac
6,git diff 比較暫存區域和工作目錄
  E:\MyProject\test>git diff
  diff --git a/java.java b/java.java
  index e69de29..e483af9 100644
  --- a/java.java ------------>暫存區域
  +++ b/java.java ------------->工作區
  @@ -0,0 +1,6 @@ ------------->"-" 表示舊文件 "+"表示新文件 "1,6" 表示第一行開始,有6行
  +class java
  +{
  + public static void main(){
  +
  + }
  +}
  \ No newline at end of file ------------->文件不是以換行符結尾
7,git diff 快照ID1 快照ID2 ---比較兩個歷史快照
  E:\MyProject\test> git diff a259a 0fab929
  diff --git a/java.java b/java.java
  index 7efd50d..931b771 100644
  --- a/java.java
  +++ b/java.java
  @@ -2,5 +2,6 @@ class java
  {
    public static void main(String arrs[]){
    System.out.print("Hello Word");
  + System.out.print("Hello Word");
  }
  }
  \ No newline at end of file
8,git diff HEAD 比較當前工作目錄和Git倉庫中的快照
  E:\MyProject\test>git diff HEAD
  ........
9,git diff -- cached [快照ID] 比較暫存區域和Git倉庫快照
  E:\MyProject\test>git diff --cached
  .........
10,git commit --amend 修改最後一次提交
  在實際開發中,可能會遇到以下情況:
  情景一:版本剛一提交(commit)到倉庫,突然想起漏掉兩個文件還沒有添加(add)
  情景二:版本剛一提交(commit)到倉庫,突然想起版本說明寫得不夠全面,需要添加
  *執行帶 --amend 選項的 commit 提交命令, Git 就會 "更正" 最近的一次提交
  :q ---->冒號 q 退出
  :q! --->不保存退出
11,git checkout -- 文件名 恢復刪除的文件
  E:\MyProject\test>git status
  On branch master
  Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

  deleted: java.java

  no changes added to commit (use "git add" and/or "git commit -a")
  E:\MyProject\test>git checkout -- java.java ------>恢復刪除的 java 文件
12,git rm 文件名 刪除文件
  ①該命令刪除的只是工作目錄和暫存區域的文件,也就是取消跟蹤,在下次提交時不納入版本管理
  E:\MyProject\test>git rm java.java
  rm ‘java.java‘

  ②當工作目錄和暫存區域的同一個文件存在不同內容時,執行 git rm -f 文件名 命令就可以把兩個都刪除
  E:\MyProject\test>git rm test.txt
  error: the following file has staged content different from both the
  file and the HEAD:
  test.txt
  (use -f to force removal)

  使用 git rm -f 強制刪除 ,工作區和暫存區的文件
  E:\MyProject\test>git rm -f test.txt
  rm ‘test.txt‘

  ③如果只刪除暫存區域的文件,而保留工作目錄的,可以執行 git rm --cached 文件名 命令
  E:\MyProject\test>git rm --cached test.txt
13,git mv 舊文件名 新文件名 重命名文件
  相當於:
  - ren / mv 舊文件名 新文件名
  - git rm 舊文件名
  - git add 新文件名
14,git branch 分支名 創建分支
  E:\MyProject\test>git branch feature
  查看
  E:\MyProject\test>git log --decorate
  commit a259a75c725756393022edb044604154d6bc0f30 (HEAD -> master, feature) ---> master 默認分支
15,git checkout 分支名 切換分支
  E:\MyProject\test>git checkout feature
  Switched to branch ‘feature‘
  D java.java
  M readme.md
  查看
  E:\MyProject\test>git log --decorate --oneline ----->oneline 一行顯示一個快照
  a259a75 (HEAD -> feature, master) changed java.java readme.md at first
  85572b6 add readme and java
  查看所有分支提交日誌
  E:\MyProject\test>git log --decorate --oneline --graph --all
  * f03e7b2 (HEAD -> feature) add test.txt at feature
  * ee36fec changed readme at next
  * a259a75 (master) changed java.java readme.md at first
  * 85572b6 add readme and java
16, git merge 分支名 合並分支
  E:\MyProject\test>git merge feature2
  Updating c01d871..c1634a9
  Fast-forward
  feature2.txt | 1 +
  1 file changed, 1 insertion(+)
  create mode 100644 feature2.txt
17,git branch --delete 分支名 刪除分支
  簡寫: git branch -d 分支名
  E:\MyProject\test>git branch --delete feature2
  Deleted branch feature2 (was c1634a9).
18,git checkout HEAD~ 匿名分支
  E:\MyProject\test2>git log --decorate --all --oneline --graph
  * fa9ecca (HEAD -> master) add 2.txt third
  * 5edd797 add 1.txt second
  * 2f6c50e add a,b,c txt first

  E:\MyProject\test2>git checkout HEAD~
  Note: checking out ‘HEAD~‘.

  You are in ‘detached HEAD‘ state. You can look around, make experimental
  changes and commit them, and you can discard any commits you make in this
  state without impacting any branches by performing another checkout.

  If you want to create a new branch to retain commits you create, you may
  do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-nam  HEAD is now at 5edd797... add 1.txt second

19,checkout
  ①從歷史快照(或者暫存區域)中拷貝文件到工作目錄
  當指定某個文件名時,Git 會從指定的提交中拷貝文件到暫存區域和工作目錄,比如執行
  git checkout HEAD~ README.md 命令會將上一個快照中的 README.md 文件復制到
  工作目錄和暫存區域中
  如果命令中沒有指定具體的快照ID,則將從暫存區域恢復指定文件到工作目錄
  git checkout -- README.md "--" 是預防恰好有一個分支叫 README.md,如果沒有,可以省略
  ②切換分支
20,checkout 和 reset
  ①恢復文件
  checkout 命令和 reset 都可以用於恢復指定快照的指定文件,並且他們都不會改變 HEAD 指針的指向
  它們的區別是 reset 命令只能將指定文件恢復到暫存區域(-- mixed), 而 checkout 命令是同時覆蓋暫存區域和工作目錄 -----> reset 命令更安全些
  ②恢復快照
  reset 命令是用來"回到過去"的,根據選項的不同, reset 命令將移動 HEAD 指針(-- soft)
  -->覆蓋暫存區域(-- mixed, 默認) -->覆蓋工作目錄(-- hard)
  checkout 命令用於切換分支,事實上也是通過移動HEAD指針和覆蓋暫存區域,工作目錄來實現的
  區別:第一個區別是對應 reset -- hard 命令來說, checkout 命令更安全.因為 checkout 命令在切換
  分支前會先檢查一下當前的工作狀態,如果不是 "clean" 的話, Git 不會允許你這樣做;而 reset --hard 命令是直接覆蓋所有數據
  第二個區別是如何更新 HEAD 指向, reset 命令會移動 HEAD 所在分支的指向, 而 checkout 命令只會移動 HEAD 自身來指向另一個分支
  

Git 學習筆記