git 初步使用

以前簡單用過git ui,到ubuntu裏面用git命令行,發現對git一竅不通,從新弄。css

 

      git 配置文件

  1. git的配置文件位置
    針對全部用戶:/etc/gitconfig
    針對當前用戶: ~/.gitconfigpython

  2. 查看配置的方法nginx

    git config --list
  3. 修改配置的方法git

    git config --global user.name "wangyubin" (修改的是~/.gitconfig) git config --system user.name "wangyubin" (修改的是/etc/gitconfig)

 

git 基本使用

 

    1. clone現有倉庫github

      git clone URL (URL支持git,ssh,http,https等各類協議)
    2. git中文件的各個狀態sql

      • unstaged - git倉庫中沒有此文件的相關記錄
      • modified - git倉庫中有這個文件的記錄,而且此文件當前有改動
      • staged - 追加,刪除或修改的文件被暫時保存,這些追加,刪除和修改並無提交到git倉庫
      • commited - 追加或修改的文件被提交到本地git倉庫(git倉庫中大部分都是這種文件,因此git status不顯示這些文件)
    3. 查看git倉庫中各文件狀態ubuntu

      git status
    4. 初始化一個倉庫swift

      git init

      在當前文件夾下生成.git目錄,完成初始化,此時此文件夾下的全部文件處於unstaged狀態vim

    5. 追加文件ruby

      git add test.c

      test.c的文件變爲staged狀態,其餘文件仍是unstaged狀態

      5.1 追加文件的結果1 - 恢復爲原先狀態(變爲unstaged)

      git rm --cache test.c

      5.2 追加文件的結果2 - 提交到git倉庫(變爲commited)

      git commit -m "my message"
    6. 修改文件

      echo "aaa" >> test.c

      test.c的狀態變爲modified

      6.1 修改文件的結果1

      git add test.c (暫時保存修改的內容,即變爲staged)

      下面有2條路能夠選擇:
      6.1.1 取消剛纔的暫時保存

      git reset test.c (狀態變回modified)

      6.2.2 將暫存的修改提交到git倉庫

      git commit -m "my message"

      6.2 修改文件的結果2

      git checkout test.c (將test.c恢復爲git倉庫中的最新版本,即變爲commited狀態,test.c的內容和5.2節同樣)
    7. 刪除文件
      7.1 從git倉庫和磁盤上刪除文件

      git rm test.c (當前目錄中刪除了test.c,在git倉庫中暫時刪除了test.c,至關於staged狀態)

      7.1.1 從git倉庫中刪除test.c

      git commit -m "my message" (git倉庫之後再也不維護test.c)

      7.1.2 刪錯了,恢復剛纔的操做

      git reset HEAD test.c (恢復到刪除前的狀態,當前目錄中已刪除的test.c也恢復了,test.c仍文commited狀態)

      7.2 僅從git倉庫中刪除文件

      git rm --cache test.c (當前目錄中沒有刪除了test.c,僅在git倉庫中暫時刪除了test.c,至關於staged狀態)

      7.2.1 從git倉庫中刪除test.c

      git commit -m "my message" (git倉庫之後再也不維護test.c,可是當前目錄中仍然有test.c)

      7.2.2 刪錯了,恢復剛纔的操做

      git reset HEAD test.c (和7.1.2同樣)

      7.3 誤刪除後的恢復
      若是刪除了一個文件,而且commit以後發現刪錯了。也能夠恢復,

      git log  (查看各次的提交信息)
      git checkout commit號 (恢復到未刪除前的commint號,此時刪除的文件也恢復到磁盤上了) git checkout master (備份好刪除的文件後,再回到最新狀態)

    git 遠程倉庫

    1. 查看遠程倉庫
      1.1 簡單查看-全部倉庫

      git remote (只能查看遠程倉庫的名字)

      1.2 查看更多內容-全部倉庫

      git remote -v (遠程倉庫的名字及git地址)

      1.3 查看單個倉庫的信息

      git remote show [remote-name]
    2. 新建遠程倉庫

      git remote add [shortname] [url] ex. git remote add mc git://www.host.com/gitdir/mycode.git
    3. 修改遠程倉庫

      git remote rename [oldnanme] [newname]
    4. 刪除遠程倉庫

      git remote rm [remote-name]
    5. 遠程倉庫的數據
      5.1 獲取數據

      git fetch [remote-name] (獲取倉庫的全部更新,可是不自動合併當前分支) git pull (獲取倉庫的全部更新, 而且自動合併到當前分支)

      5.2 上傳數據

      git push [remote-name] [branch-name] ex. git push origin master

    git 標籤

    1. 列出標籤
      1.1 查看全部tag

      git tag

      1.2 查看某個tag

      git show [tag-name]
    2. 新建標籤
      2.1 輕量級tag

      git tag [tag-name]

      2.2 帶標註的tag

      git tag -a [tag-name] -m "tag message"

      2.3 後期追加tag

      git log --pretty=oneline (查看全部的commit號) git tag -a [tag-name] [commit號前幾位便可]
    3. 刪除標籤

      git tag -d [tag-name]
    4. 提交標籤到遠程倉庫

      git push [remote-name] --tags ex. git push origin --tags

    git 分支

    1. 查看和切換分支

      git branch (查看全部的分支及當前處於哪一個分支)
      git branch -v (查看全部的分支的詳細信息)
      git branch --merged (查看已經合併的分支) git branch --no-merged (查看還沒合併的分支) git checkout [branch-name] (切換到某個分支)
    2. 新建分支

      git branch [branch-name] (新建一個分支) git branch -b [branch-name] (新建一個分支並切換到這個分支上)
    3. 合併分支

      git merge [branch-name] ex. 將分支btest合併到主分支master git checkout master git merge btest

      merge時有衝突的文件會列出來,須要手動合併

      將衝突手動解決後,再次用 git status來查看是否還有 unmerged的文件。
      若是沒有衝突的文件,就能夠 git commit 來提交此次合併了。

    4. 刪除分支

      git branch -d [branch-name] 或者 git branch -D [branch-name] (強制刪除某個還未合併的分支)
    5. 遠程分支相關
      5.1 新建遠程分支

      1. git checkout [local_branch] (首先進入想要上傳的分支)
      2. git remote add [remote_repo] [remote_branch]
        (這裏的[remote_branch]是遠程分支的名字,通常和[local_branch]同名,
        [remote_repo]是遠程倉庫的名字)

      3. 2 向遠程分支推送數據

        git push [remote_repo] [remote_branch]

      4. 3 刪除遠程分支

        git push [remote_repo] :[remote_branch] (注意遠程分支前有個":")

    6. 合併分支的另外一個方法:衍和

    衍和能夠簡化master上的提交記錄,使得代碼能夠方便的回退,
    可是在公共倉庫上用衍和有必定的風險。
    衍和我基本用不上,這裏就不贅述了。

    服務器建立 git 倉庫, 並將其做爲遠程倉庫

    其實 git 是分佈式的 SCM. 並不存在誰是服務器, 誰是客戶端的問題, 這裏所說的服務器上的git倉庫, 指的是多人合做開發時, 共用的, 做爲最終發佈版本的 git 倉庫.
    這個 git 倉庫就至關於你在 github 上建的倉庫, 會將你在各個電腦上作的代碼等提交到上面進行統一管理.

    1. 服務端 (遠程 git 倉庫)

      • 生成用於git服務的帳戶 (通常就用git)

        groupadd gpxxx useradd -m -g gpxxx gitxxx
      • 初始化服務端的git 倉庫

        cd ~/ mkdir git-repo cd git-repo mkdir test.git cd test.git git --bare init
    2. 客戶端 (本地 git 倉庫)

      • 新建本地git 倉庫

        cd ~/gitlocal mkdir test cd test git init
      • 初始化本地倉庫

        touch README
        git add README git commit -m 'first commit for init'
      • 設置git用戶信息

        git config --global user.name "wangyubin" git config --global user.email "xxx@xxx.com"
      • 關聯遠程倉庫

        git remote add origin gituser@<server address>:~/test.git/
      • 將本地倉庫提交到遠程

        git push origin master

    git 使用中遇到的一些問題

    git pull 時, 遠程文件與本地文件有衝突

    若是遠程的倉庫被其餘人更新了, 而且更新的內容與我本身本地編輯的內容有衝突. 這時執行 git pull 可能有以下message:

    Auto-merging path/to/conflict-file CONFLICT (content): Merge conflict in path/to/conflict-file Automatic merge failed; fix conflicts and then commit the result.

    用文本編輯器 vim 或者 emacs 之類的來編輯衝突的文件 path/to/conflict-file, 衝突的地方有相似以下的顯示

    <<<<<<< HEAD
        App_Log.logger.debug(u'開始時間: ' + utils.datetime2str(datetime.datetime.now())) file = request.FILES.get('file-xxx') App_Log.logger.debug(u'結束時間: ' + utils.datetime2str(datetime.datetime.now())) ======= file = request.FILES.get('xxxx') >>>>>>> 3602514cc2bf1b3a64470b31ad79e07fe372add5

    ===== 之上的 <<<<<<< HEAD 是本地的內容
    ===== 之下的 >>>>>>> 3602514cc2bf1b3a64470b31ad79e07fe372add5 是遠程的內容(這個commit號每次都會不一樣)
    根據實際狀況, 刪除多餘的內容(包括===== >>>>> <<<<<< 之類的), 修改衝突的地方, 若是以本地的代碼爲準的話, 會獲得以下結果:

    App_Log.logger.debug(u'開始時間: ' + utils.datetime2str(datetime.datetime.now())) file = request.FILES.get('file-xxx') App_Log.logger.debug(u'結束時間: ' + utils.datetime2str(datetime.datetime.now()))

    而後 git commit -am '提交的信息' 就解決了衝突.
    最後, 也能夠將本地的修改同步到遠程 git 倉庫: git push

    git pull 時, 本地還有未commit 的文件

    從遠程倉庫更新時, 假使本地還有沒commit的文件A, 遠程倉庫的A文件卻被修改了. 此時進行 git pull 時有以下信息:

    6a707cc..f93575d master -> origin/master Updating 6a707cc..f93575d error: Your local changes to the following files would be overwritten by merge: apps/myapp/utils.py Please, commit your changes or stash them before you can merge. Aborting

    此時, 若是不想將本地文件commit(可能只是臨時的修改), 可是又像將遠程的倉庫更新下來, 能夠這樣:

    $ git stash    # 先將本身的改變保存起來 Saved working directory and index state WIP on master: 6a707cc ... HEAD is now at 6a707cc ... $ git pull # 從遠程倉庫更新 Updating 6a707cc..f93575d ... ... $ git stash pop # 將本身的修改合併到更新後的代碼中

    最後一步若是有衝突, 再參照上一節中解決衝突的步驟, 用文本編輯器修改衝突文件.

    git 分支合併時的衝突

    正在開發的分支和主分支的編輯了同一個文件時, 在主分支上進行 merge 的時候可能會產生衝突.
    如下構造一個衝突的示例:

    $ git branch test # 建立一個分支 test, 可是沒有進入test分支, 此時還在 master 分支上. $ vim xxxx # 編輯 master 分支上的一個已有的文件 $ git commit -am 'xxx message' # 提交 master 分支的修改 $ git checkout test # 切換到 test 分支 $ vim xxxx # 編輯以前在 master 上編輯的文件, 能夠編輯同一個地方, 形成衝突 $ git commit -am 'xxx message' # 提交 test 分支的修改 $ git checkout master # 切換到 master 分支 $ git merge test # 將 test 分支合併到 master 分支, 因爲上面編輯了同一文件, 這裏會產生衝突 Auto-merging xxxx CONFLICT (content): Merge conflict in xxxx Automatic merge failed; fix conflicts and then commit the result.

    最後, 參照上一節中解決衝突的步驟, 用文本編輯器修改衝突文件.

    經過 git 提取補丁

    提取的補丁的方法有多種:

    $ git format-patch -1     # 提取本次 commit 和上次 commit 之間的不一樣, 並生成patch文件 $ git format-patch -2 # 提取本次 commit 和 上上次 commit 之間的不一樣, 並生成patch文件 $ git format-patch commit號1 commit號2 # 提取2次commit號之間的不一樣, 並生成patch文件 (commit號能夠經過 git log 來查看) $ git format-patch tag1 tag2 # 提取2次tag之間的不一樣, 並生成patch文件 (tag能夠經過 git tag 來查看)

    經過 git 提取指定版本的源碼

    這個功能在部署的時候比較有用.

    $ git archive --format=tar --prefix="tagxx/" tagxx > ../tagxx.tar # 獲取 tagxx 的源碼, 加了 --prefix 的做用是在最終的 tagxx.tar 中加了一層文件夾 tagxx

    上面的 tagxx 也能夠是 commit號

相關文章
相關標籤/搜索