Git 學習

一、基本操作

  • 將當前目錄初始化一個git倉庫
    git init
  • 將文件快照放入暫存區域
    git add 文件
  • 提交更新,找到暫存區域的文件,將快照永久存儲到git倉庫
    git commit -m "提交信息,建議寫有意義的詳細信息,方便從歷史記錄中找到改動記錄"
    可以多次git add 不同文件,commit一次將暫存區所有修改提交
  • 查看倉庫當前狀態
    git status
    下面的命令輸出告訴我們,demo.txt被修改過,但未提交
$ 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:   demo.txt

no changes added to commit (use "git add" and/or "git commit -a")

  • 查看修改的內容
    git diff 文件
  • 查看提交日志
    git log
    如果看的眼花繚亂,可以加上--pretty=oneline
  • 回退到某一版本
    git reset --hard 某一版本 回退到往上100個版本
    HEAD表示當前版本
    HEAD^表示上一個版本
    HEAD^^表示上上一個版本
    HEAD~100表示往上100個版本
  • 回到之前最新版本
    git reset --hard 版本id id越長越好,不然容易找到多個版本號
    1. 在命令行窗口還沒關閉的情況下,找到那一版本的commit id(一串十六進制)
    2. Git提供了一個命令記錄你的每一次命令
      git reflog
      可以從中找到對應commit id
  • 撤銷修改
    git checkout -- 文件
    回退到最近一次git commitgit add時的狀態
    命令中--很重要,沒有就變成“切換到另一個分支”
  • 撤銷暫存區的文件,重新放回工作區
    git reset HEAD 文件
  • 刪除文件
    git rm 文件
    • 第一種情況 git rm并且 git commit 將刪除版本庫的文件。
    • 第二種情況git checkout -- 文件 將被刪除的文件恢復到最新版本。

二、遠程倉庫

  • 創建SSH Key
    ssh-keygen -t rsa -C "郵箱" 會在用戶主目錄下生成.ssh目錄
    id_rsa私鑰,不可泄露
    id_rsa.pub公鑰,可以告訴任何人
  • 在GitLab上添加SSH密鑰(公鑰)
  • 在GitLab中創建倉庫,并復制倉庫的SSH格式的URL(注意不是地址欄的URL)
添加遠程倉庫
  • 關聯遠程庫,在本地倉庫下運行命令
    git remote add origin 倉庫URL 這里是GitLab倉庫的URL
    其中origin是遠程庫的名字,可以修改。
  • 將本地庫內容推送到遠程庫
    git push -u 遠程庫名稱 master
    ??用git push命令,實際上是把當前分支master推送到遠程。
    ??由于遠程庫是空的,我們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以后的推送或者拉取時就可以簡化命令。
    ??從現在起,只要本地作了提交,就可以通過命令git push 遠程庫名稱 master推送到GitLab
從遠程庫克隆
  git clone 遠程倉庫的URL  
  //這樣本地倉庫就已經將遠程倉庫項目克隆下來了。

三、分支管理

??因為創建、合并和刪除分支非常快,所以Git鼓勵你使用分支完成某個任務,合并后再刪掉分支,這和直接在master分支上工作效果是一樣的,但過程更安全。

  • 創建并切換分支
    git checkout -b 分支
    git checkout 命令加上 -b表示創建并切換,相當于一下兩條命令
    git branch 分支
    git checkout 分支
  • 查看當前分支
    git branch

  • 切換分支
    git checkout 分支

  • 合并指定分支到當前分支
    git merge 指定分支

  • 刪除分支
    git branch -d 分支

  • 解決沖突

修改dev分支后

$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
//修改分支后,從分支切換到master時,Git還會自動提示我們當前master分支比遠程的master分支要超前1個提交。

如果此時再修改master分支內容,合并時會提示沖突

$ git merge feature1
Auto-merging demo.txt
CONFLICT (content): Merge conflict in demo.txt
Automatic merge failed; fix conflicts and then commit the result.
//Git告訴我們,demo.txt文件存在沖突,必須手動解決沖突后再提交。

git status也可以告訴我們沖突的文件
在文件內容中Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容
將沖突的內容統一,解決沖突內容后重新提交即可。

  • 查看分支合并情況
    git log --graph --pretty=oneline --abbrev-commit
    git log --graph查看分支合并圖
分支管理策略

??通常,合并分支時,如果可能,Git會用Fast forward模式,但這種模式下,刪除分支后,會丟掉分支信息。
如果要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支信息。

  • 禁用Fast forward模式,創建分支
    git merge --no-ff -m "詳細合并信息" dev
BUG分支

??軟件開發中,bug就像家常便飯一樣。有了bug就需要修復,在Git中,由于分支是如此的強大,所以,每個bug都可以通過一個新的臨時分支來修復,修復后,合并分支,然后將臨時分支刪除。
??當你接到一個修復一個代號101的bug的任務時,很自然地,你想創建一個分支issue-101來修復它,但是,當前正在dev上進行的工作還沒有提交。
??并不是你不想提交,而是工作只進行到一半,還沒法提交,預計完成還需1天時間。但是,必須在兩個小時內修復該bug,怎么辦?
??幸好,Git還提供了一個stash功能,可以把當前工作現場“儲藏”起來,等修改BUG以后恢復現場繼續工作:

  • 將當前工作現場“儲藏”起來,等以后恢復現場繼續工作
    git stash
    現在用git status查看工作區,工作區就是干凈的(除非沒有被Git管理的文件)
  • 查看“儲藏”的工作現場
    git stash list
  • 恢復最近一次“儲藏”的工作現場
    git stash apply
    恢復指定工作現場,通過git stash list查看工作現場的序號,將(stash@{序號})追加到命令后面
    注意,序號越靠后,說明儲藏的時間越長
    這樣恢復后,stash內容并不會刪除,需要手動刪除
  • 刪除“儲藏”的工作現場
    git stash drop
  • 恢復并刪除“儲藏”的工作現場
    git stash pop
  • master分支出現bug,說明dev同樣也存在,Git專門提供了命令,讓我們復制一個特定的提交到當前分支
    git cherry-pick 特定的提交id
Feature分支

??軟件開發中,總有無窮無盡的新的功能要不斷添加進來。
??添加一個新功能時,你肯定不希望因為一些實驗性質的代碼,把主分支搞亂了,所以,每添加一個新功能,最好新建一個feature分支,在上面開發,完成后,合并,最后,刪除該feature分支。
??如果在feature分支還沒有合并前,需要取消這個功能,刪除時會銷毀失敗,需要使用大寫的-D參數強制刪除。
?? git branch -D 分支

多人協作

??當你從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,并且,遠程倉庫的默認名稱是origin。

  • 查看遠程庫的信息
    git remote -v -v表示詳細信息
  • 推送分支
    git push 遠程庫名稱 本地分支名稱
  • 抓取分支
    git clone 遠程倉庫的URL 默認只能看到本地的master分支
    如果要在dev分支上開發,就必須創建遠程origin的dev分支到本地
    git checkout -b dev origin/dev 創建并且還dev分支,并將遠程庫origin/dev 弄下來
    如果最新提交和你推送的提交有沖突,先用git pull把最新提交抓下來,然后在本地合并,解決沖突,再提交。
//git pull 失敗
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> dev
//原因是沒有指定本地dev分支與遠程origin/dev分支的鏈接,根據提示,設置dev和origin/dev的鏈接
  • 設置本地分支dev與遠程分支origin/dev的鏈接
    git branch --set-upstream-to=origin/dev dev

  • 多人協作工作模式
    盡量將沖突在本地解決

  1. pull遠程庫內容到本地先進行合并
  2. 如合并沖突,則解決沖突
  3. 如沒有沖突或解決后,再commit 并push到遠程庫

四、遇到的問題

  • HTTP Basic: Access denied 錯誤
  1. 如果賬號密碼變動,使用git config --system --unset credential.helper 重新輸入賬號密碼
  2. 如果第一條命令解決失敗,使用git config --global http.emptyAuth true
  3. 還可以進入 控制面板>>用戶賬號>>憑據管理器>>windows憑據>>普通憑據 ,在里面找到git,可以編輯用戶密碼
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Git 是目前最流行的分布式版本控制系統之一。 版本控制指的是,記錄每次版本變更的內容和時間等細節,保留各版本之間...
    神齊閱讀 1,464評論 0 7
  • 聲明:這篇文章來源于廖雪峰老師的官方網站,我僅僅是作為學習之用 Git簡介 Git是什么? Git是目前世界上最先...
    橫渡閱讀 3,987評論 3 27
  • 這篇博文是自己在學習git過程中的思考總結。本文僅僅代表個人的看法,如有不妥地方還請本文文末留言。 ?? 原文鏈接g...
    Ming_Hu閱讀 1,120評論 4 18
  • 安裝Git Git的下載地址:Git官網下載地址 Git本地倉庫和命令 配置用戶 下載完Git后,右鍵會有一個Gi...
    TokyoZ閱讀 4,529評論 1 7
  • 教程網址:http://www.liaoxuefeng.com/wiki/0013739516305929606d...
    maybenai閱讀 707評論 0 1