Myth 關於Git的學習筆記

neuyu發表於2021-09-09
Tips:
  • 1 、雖然在物理上本地倉庫中所有檔案是放在一起的,但是分支之間是互不能訪問以及操作的
  • 2 、在本地的每次commit都是有index的,上傳到github可以不用那麼頻繁,反正都是有記錄的
  • 3、 在github上修改了專案後,或者以後是和別人一起開發,就要先git pull origin (master)將別人的分支和自己的分支都拉下來確保是最新,再進行git push -u origin master 才能正確提交程式碼,如果不pull,提交是註定失敗的,還會擾亂分支圖
  • 4、在github上修改檔案,容易引起編碼的變化,這時候沒有pull就修改檔案再commit也是會在push的時候很麻煩,最好在本地修改檔案
    最好是,在github上修改了就在本地pull之後再修改檔案,萬一出錯了回退也簡單
  • 5、出現了衝突,從而無法自動merge:

        git pull 對方的分支
        git checkout 自己的分支
        git merge --no-ff 對方的分支
        git push (自己的源+分支)origin master
  • Windows下記住密碼 :
    • 新建環境變數 HOME 值:%USERPROFILE%
    • 在C盤User下你的當前使用者目錄下新建_netrc文字檔案:
      • machine
      • login ***
      • password ***
    • 成功配置,測試便知
  • Linux下記住密碼:
    • touch .git-credentials
    • vim .git-credentials
    • 輸入: http://{username}:{password}@github.com 或者是https開頭
    • git config --global credential.helper store
    • ~/.gitconfig 檔案中多了以下內容即可
      • [credential]
      • helper = store
【目前使用git的方法】
  • 1.在GitHub上新建一個專案,不勾選初始化,複製下URL
  • 2.在eclipse新建專案,git到本地某資料夾下
  • 3 然後在eclipse裡新增git remote
  • 4.commit -》push 完成
  • 5.開啟Git Bash 使用命令列再檢視一下,雖然有時候問題比較奇怪,但是一般不會有啥問題
  • 執行了1、2步驟後:直接
    git remote add origin StudentManager.git
    git push -u origin master
    =====或者:=====
    echo "# StudentManager" >> README.md
    git init
    git add README.md
    git commit -m "first commit"
    git remote add origin StudentManager.git
    git push -u origin master

【git commit】

    git commit 不帶命令:進入VI編輯器
    第一行:用一行文字簡述提交的更改內容
    第二行:空行
    第三行:記述更改的原因和詳細內容
    使用下面方法關閉退出

【git remote】

  • 新增遠端關聯倉庫 git remote add origin URL地址
  • 修改關聯倉庫 git remote set-url origin URL地址

【git push】

  • 出現RPC failed; result=22, HTTP code = 411 的錯誤
    • 就是因為一次提交的檔案太大,需要改大緩衝區 例如改成500m
    • git config http.postBuffer 524288000

Git Bash下的操作
【git初始化】
    $git config --global user.name " "
    $git config --global user.email " "
    $git config --global color.ui  auto 
【VI編輯器的使用】

git 在pull或者合併分支的時候有時會遇到開啟 VI編輯器 的狀態 可以不管(直接下面3,4步)
如果要輸入解釋的話就需要:

    1.按鍵盤字母 i 進入insert模式
    2.修改最上面那行黃色合併資訊,可以不修改
    3.按鍵盤左上角"Esc"
    4.輸入":wq",注意是冒號+wq,按Enter鍵即可 
    Ctrl + Z +Z 也能退出
【GitHub 】
    【Markdown語法】:  
        @使用者名稱, @組織名 ;#編號 會連線到該倉庫對應的Issue編號 。
        透過 使用者名稱/倉庫名 #編號 來指定倉庫的指定Issue
    【將Bash和GitHub繫結起來】:
        1.在GItHub上設定SSH key, 有一個即可
        2.$ssh-keygen -t rsa -C "Kuangchengping@outlook.com" 回車 
        3.設定密碼 ad14293366
        4.測試SSH $ssh -T git@github.com  輸入yes 輸入 密碼  ****

【 .gitingnore 檔案】 :

  • test.txt 忽略該檔案
  • *.html 忽略所有HTML檔案
  • *[o/a] 忽略所有o和a字尾的檔案
  • !foo.html 不忽略該檔案
  • 示例檔案

      # maven #
      target/
    
      # IDEA #
      .idea/
      *.iml
      out/
      # eclipse #
      bin/
      .settings/
      .metadata/
      .classpath
      .project
      Servers/

    克隆專案: $git clone URL

【從空白建立倉庫:】
  • 1.先在GitHub上建立一個倉庫,不勾選Initialize...(原因是等會連遠端倉庫還得pull一下才能push)
  • 2.若在某已有倉庫下:在那個目錄下執行Git Bash
    • 2.1 mkdir 庫名 建立一個資料夾,最好和遠端的庫同名
    • 2.2 git init 初始化(建立 .git 相關檔案) touch 一個README.md
    • 2.3 git remote add origin master URL 連上遠端倉庫
    • 2.4 git push -u origin master 輸入使用者名稱,密碼(若因為沒有上游節點就按提示輸入命令建立初始節點即可)
【常用命令】
    git touch file1 file2  新建三個檔案
    echo "  ">>file1  修改檔案file1
    git rm 檔名  : 刪除檔案至快取區
    vi 檔名  : 使用VI編輯器來新建檔案  要特別注意其退出

    git commit -am " " 從快取提交(切記要先 commit 才能 push)
    git diff  : 檢視當前工作樹和暫存區的差別
    git diff --cached :檢視快取中檔案修改的痕跡和對比 輸入q 退出
    git log --graph :檢視(圖形化)提交日誌 輸入q退出
    git banrch 分支名 :建立新的分支
    git branch -a 檢視當前分支資訊
    git checkout -b:建立一個分支,並立即切換
    git checkout -b feature-D origin/feature-D 新建一個分支來接收同步後面那個遠端倉庫的分支
    git pull :獲取最新的遠端倉庫分支
    git pull origin feature-D :只把本地的feature-D分支更新到最新
    git merge--no-ff feature-D 將當前分支與分支feature-D 合併
    git reset --hard 雜湊值:資料庫的回滾操作似的
    git reflog 檢視倉庫的操作日誌
    git mv -k oldName  newName :更改檔名字

    usage: git [--version] [--help] [-C ] [-c name=value]
           [--exec-path[=]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=] [--work-tree=] [--namespace=]
            []

API文件

These are common Git commands used in various situations:
start a working area (see also: git help tutorial)
   clone      Clone a repository into a new directory
   init       Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add        Add file contents to the index
   mv         Move or rename a file, a directory, or a symlink
   reset      Reset current HEAD to the specified state
   rm         Remove files from the working tree and from the index

examine the history and state (see also: git help revisions)
   bisect     Use binary search to find the commit that introduced a bug
   grep       Print lines matching a pattern
   log        Show commit logs
   show       Show various types of objects
   status     Show the working tree status

 grow, mark and tweak your common history
   branch     List, create, or delete branches
   checkout   Switch branches or restore working tree files
   commit     Record changes to the repository
   diff       Show changes between commits, commit and working tree, etc
   merge      Join two or more development histories together
   rebase     Forward-port local commits to the updated upstream head
   tag        Create, list, delete or verify a tag object signed with GPG

 collaborate (see also: git help workflows)
   fetch      Download objects and refs from another repository
   pull       Fetch from and integrate with another repository or a local branch
   push       Update remote refs along with associated objects

'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help ' or 'git help '
to read about a specific subcommand or concept.
【git reset常用方式】

(1):回滾add操作

    edit  (1)
        git add a.txt b.txt
        看郵件(2)
        git reset(3) 
        git pull URL
    1.1 編輯了兩個檔案並且新增到了index
    1.2 接收郵件,發現某人要你pull,有一些改變需要你merge 下來
    1.3 然而你已經把index給改變了,因為當前的index 和 HEAD commit不匹配了,但是你知道,即將pull的東西不會影響
        到a.txt 和 b.txt,因此你可以revert這兩個檔案的改變,revert後,那些改變依然在working directory中,因此需要執行git reset
    1.4 然後,執行了pull後 自動merge,兩個檔案依然在working directory中

(2):回滾最近一次commit

    git commit ...
        git reset --soft HEAD^(1)
        edit (2)
        git commit -a -c ORIG_HEAD(3)
    2.1 當提交後,你發現提交的程式碼不完善,需要重新編輯一下,執行 1 語句讓working directory和reset之前一樣,不做改變
    2.2 對working tree下的檔案做修改
    2.3 然後使用reset之前那次commit的註釋等相關資訊都重新提交,注意老的HEAD會被備份到檔案.git/ORIG_HEAD中,命令中就是引用了這個老的相關資訊
        -a 表示自動將所有的修改的和刪除的檔案都放進 stage area(理解為程式碼區,未被git跟蹤的檔案不受影響)
        -c 表示 拿已經提交的commit物件中的資訊來做這次的提交
    這條命令就是,將所有更改的檔案加入到stage area中,並使用上次的提交資訊來提交

(3):回滾最近幾次的commit,並新增到一個新建的分支上去

        git branch myth/test (1)
        git reset --hard HEAD^3 (2)
        git checkout myth/test (3)
    3.1 你已經提交了好幾個commit,但是覺得不夠成熟和完善,不足以新增到master分支上,所以在當前HEAD建立一個新分支
    3.2 然後回滾掉最近三次提交(刪除)
    3.3 切換到新分支上就能對程式碼進行潤色了,等待之後的merge

(4):永久刪除最近幾次

  • commit git reset --hard HEAD~3

    (5):回滾merge和pull操作

        git pull URL (1)
        git reset --hard (2)
        git pull .topic/branch (3)
        git reset --hard ORIG_HEAD (4)
    5.1 從origin上拉下來一些更新,但是產生了許多衝突,暫時又沒時間去解決這些衝突,所以想撤銷pull操作,等待以後來pull
    5.2 由於pull操作產生了衝突,因此所有pull下來的改變尚未提交,仍然在stage area中,這種情況下 
        git reset --hard 與 git reset --hard HEAD 效果一樣
            都是清除那些使index和working directory亂套的東西
    5.3 將topic/branch 合併到當前的branch,這次沒有衝突,並且合併後的更改自動提交
    5.4 但是此時又覺得將topic/branch合併過來又太早了,決定回滾merge操作,執行4語句  之前有說過,git reset操作會備份一個ORIG_HEAD,
            pull和merge操作同樣會,為了回滾操作

    (6):在被汙染的working tree中回滾merge或者pull

        git pull (1)
        git reset --merge ORIG_HEAD (2)
    6.1 即使在本地已經更改了tree,導致了index的變化,也可以放心的pull,前提是你知道將要pull的內容不會覆蓋你的working tree中的內容
    6.2 git pull 之後,你發現這次pull的有問題,想要撤銷操作,如果使用git reset --hard ORIG_HEAD也可以,但是這會刪除add的程式碼
            使用 git reset --merge ORIG_HEAD 就可以避免回滾操作時刪除add的程式碼

    (7):被中斷的工作流程

    在實際開發中經常出現這樣的情形:你正在開發一個大的feature,此時來了一個緊急的BUG需要修復,但是目前在working tree 中的內容還不足以commit
        ,但是又必須切換到另外的branch去 fix bug
        git checkout feature;
        碼程式碼
        git commit -a -m "暫時中斷OO" (1)
        git checkout master 
        修復bug
        git commit ;
        git checkout feature
        git reset --soft HEAD^ #go back to OO's state (2)
        git reset (3)
    7.1 屬於臨時提交。隨便加點註釋
    7.2 這次reset刪除了OO的commit,並且把working tree設定成提交OO之前的狀態
    7.3 此時,在index中仍然留有OO提交時所做的uncommit changes,git reset 將會清理index成為尚未提交時的狀態,便於之後的工作

    (8):Reset 一個單獨的檔案

    git reset -- a.txt (1)  
    git commit -am "Commit files inindex"  (2)
        git add a.txt  (3)
    8.1 把檔案單獨從index中去除
    8.2 將index中的檔案提交
    8.3 再次新增回檔案

    (9):保留working tree 並且丟棄一些commit

    
    git tag start
        git checkout -b branch 1
        編寫
        git commit .... (1)
        編寫
        git checkout -b branch2 (2)
        git reset --keep start (3)
    9.1 這次是把branch1中的改變提交了
    9.2 此時發現,之前的提交不屬於這個branch,此時你新建了branch2,並切換到了該branch上
    9.3 此時你可以使用reset --keep 把在start之後的commit清除掉,但是保持了working tree的不變

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4550/viewspace-2807729/,如需轉載,請註明出處,否則將追究法律責任。

相關文章