1. 前言首先上一張別人整理好的圖: ? ?2. git 介紹git 是分布式版本控制系統(tǒng) 集中式 vs 分布式 (SVN vs GIT) ? SVN和 Git 主要的區(qū)別在于歷史版本維護的位置,SVN 在中央服務器,而 git 歷史版本存在于每個本地倉庫 Git本地倉庫包含代碼庫還有歷史庫,在本地的環(huán)境開發(fā)就可以記錄歷史而SVN的歷史庫存在于中央倉庫,每次對比與提交代碼都必須連接到中央倉庫才能進行 這樣的好處在于: 自己可以在脫機環(huán)境查看開發(fā)的版本歷史 多人開發(fā)時如果充當中央倉庫的Git倉庫掛了,可以隨時創(chuàng)建一個新的中央倉庫然后同步就立刻恢復了中央庫
?3. Git 命令? 3.1 git 配置 ? $ git config --global user.name "Your Name" $ git config --global user.email "email@example.com" ? ? ? 3.2 創(chuàng)建版本庫 ? 初始化一個git倉庫 $ git init ? ? 添加文件到git倉庫 包括兩步: $ git add <file> $ git commit -m "description" ?
? 3.3 查看工作區(qū)狀態(tài) $ git status ? ? 3.4 查看修改內(nèi)容 $ git diff $ git diff --cached $ git diff HEAD -- <file> ? ?
? 3.5 查看提交日志 $ git log ? 簡化日志輸出信息 $ git log --pretty=oneline ? ? ?3.6 查看命令歷史 $ git reflog ? ? 3.7 版本回退 $ git reset --hard HEAD^ 以上命令是返回上一個版本,在Git中,用 回退到指定版本 $ git reset --hard commit_id ? commit_id是版本號,是一個用SHA1計算出的序列 ? 工作區(qū)、暫存區(qū)和版本庫工作區(qū):在電腦里能看到的目錄; 版本庫:在工作區(qū)有一個隱藏目錄 ? ? 進一步解釋一些命令:
? 3.8 撤銷修改 丟棄工作區(qū)的修改 $ git checkout -- <file> 該命令是指將文件在工作區(qū)的修改全部撤銷,這里有兩種情況:
總之,就是讓這個文件回到最近一次git commit或git add時的狀態(tài)。 ? ?丟棄暫存區(qū)的修改 ?分兩步: 第一步,把暫存區(qū)的修改撤銷掉(unstage),重新放回工作區(qū): $ git reset HEAD <file> ? 第二步,撤銷工作區(qū)的修改 $ git checkout -- <file> ? ? 小結:
? ?3.9 刪除文件 $ git rm <file> ? ? $ rm <file> $ git add <file> ? ? 進一步的解釋 Q:比如執(zhí)行了 Q:如果執(zhí)行了 $ git reset head text.txt $ git checkout -- text.txt ? Q:如果真的想從版本庫里面刪除文件怎么做? A:執(zhí)行 ? 遠程倉庫創(chuàng)建SSH Key $ ssh-keygen -t rsa -C "youremail@example.com" ? 關聯(lián)遠程倉庫 $ git remote add origin https://github.com/username/repositoryname.git 推送到遠程倉庫 $ git push -u origin master ? ? ? 從遠程克隆 $ git clone https://github.com/usern/repositoryname.git ? ? 分支創(chuàng)建分支 $ git branch <branchname> ? ? 查看分支 $ git branch
? 切換分支 $ git checkout <branchname> ? ? 創(chuàng)建 切換分支 $ git checkout -b <branchname> ? ? 合并某分支到當前分支 $ git merge <branchname> ? ? 刪除分支 $ git branch -d <branchname> ? 查看分支合并圖 $ git log --graph ? 當Git無法自動合并分支時,就必須首先解決沖突。解決沖突后,再提交,合并完成。用 ? 普通模式合并分支 $ git merge --no-ff -m "description" <branchname> ? 因為本次合并要創(chuàng)建一個新的commit,所以加上 ? 保存工作現(xiàn)場 $ git stash ? ? 查看工作現(xiàn)場 $ git stash list ? ? 恢復工作現(xiàn)場 $ git stash pop ? ? 丟棄一個沒有合并過的分支 $ git branch -D <branchname> 查看遠程庫信息 $ git remote -v ? ? 在本地創(chuàng)建和遠程分支對應的分支 $ git checkout -b branch-name origin/branch-name ? 本地和遠程分支的名稱最好一致; ? 從本地推送分支 $ git push origin branch-name ? 如果推送失敗,先用git pull抓取遠程的新提交; ? 從遠程抓取分支 $ git pull 如果有沖突,要先處理沖突。 ? 標簽tag就是一個讓人容易記住的有意義的名字,它跟某個commit綁在一起。 新建一個標簽 $ git tag <tagname> 命令 ? 指定標簽信息 $ git tag -a <tagname> -m <description> <branchname> or commit_id ?
? $ git tag -s <tagname> -m <description> <branchname> or commit_id
? 查看所有標簽 $ git tag ? ? 推送一個本地標簽 $ git push origin <tagname> ? ? $ git push origin --tags ? ? 刪除一個本地標簽 $ git tag -d <tagname> ? ? 刪除一個遠程標簽 $ git push origin :refs/tags/<tagname> ? ? rebase1. 合并多個commit為一個完整commit 當我們在本地倉庫中提交了多次,在我們把本地提交push到公共倉庫中之前,為了讓提交記錄更簡潔明了,我們希望把如下分支B、C、D三個提交記錄合并為一個完整的提交,然后再push到公共倉庫。 現(xiàn)在我們在測試分支上添加了四次提交,我們的目標是把最后三個提交合并為一個提交: ? ? 也就是把 add b.py / add c.py / add d.py 合并為一個提交 這里我們使用命令: git rebase -i [startpoint] [endpoint]其中 -i 的意思是--interactive ,即彈出交互式的界面讓用戶編輯完成合并操作,[startpoint] [endpoint] 則指定了一個編輯區(qū)間,如果不指定[endpoint] ,則該區(qū)間的終點默認是當前分支HEAD 所指向的commit (注:該區(qū)間指定的是一個前開后閉的區(qū)間)。在查看到了log日志后,我們運行以下命令: git rebase -i 32d82b5 ?然后我們會看到如下界面: ? ?上面未被注釋的部分列出的是我們本次rebase操作包含的所有提交,下面注釋部分是git為我們提供的命令說明。每一個commit id 前面的 pick:保留該commit(縮寫:p) reword:保留該commit,但我需要修改該commit的注釋(縮寫:r) edit:保留該commit, 但我要停下來修改該提交(不僅僅修改注釋)(縮寫:e) squash:將該commit和前一個commit合并(縮寫:s) fixup:將該commit和前一個commit合并,但我不要保留該提交的注釋信息(縮寫:f) exec:執(zhí)行shell命令(縮寫:x) drop:我要丟棄該commit(縮寫:d) ? ? 根據(jù)我們的需求,我們將commit內(nèi)容編輯如下: ? 保存退出,然后是注釋修改界面 ? 注釋內(nèi)容根據(jù)需要進行修改,也可以不修改,直接保存退出 查看log記錄信息: ? ? 2. 將某一段commit粘貼到另一個分支上 當我們項目中存在多個分支,有時候我們需要將某一個分支中的一段提交同時應用到其他分支中,就像下圖: 我們希望將develop分支中的C~E部分復制到master分支中,這時我們就可以通過rebase命令來實現(xiàn)(如果只是復制某一兩個提交到其他分支,建議使用更簡單的命令: ?在實際模擬中,我們創(chuàng)建了master和develop兩個分支: ? master 分支 ? develop 分支 ? ? 我們使用命令的形式為: git rebase [startpoint] [endpoint] --onto [branchName] ? ? 其中, git rebase 41f40e4^ 9c1423c --onto master ? ?注:因為
運行完成后查看當前分支的日志: ? ?可以看到,C~E部分的提交內(nèi)容已經(jīng)復制到了G的后面了,大功告成?NO!我們看一下當前分支的狀態(tài): ? 當前HEAD處于游離狀態(tài),實際上,此時所有分支的狀態(tài)應該是這樣: 所以,雖然此時HEAD所指向的內(nèi)容正是我們所需要的,但是master分支是沒有任何變化的, ? ? 此時就真正完成了粘貼到master分支。 ? 自定義 gitgit 提示顯示顏色 $ git config --global color.ui true ? ? 忽視特殊文件 在Git工作區(qū)的根目錄下創(chuàng)建一個特殊的 具體參考:https://github.com/github/gitignore ? 配置別名 $ git config --global alias.st status ? 上面配置別名是將 status 定義別名為 st ,這里和linux中 alias 定義別名的概念是一致的。 ? 配置Git的時候,加上 配置文件在 ~/.gitconfig 文件中 [root@localhost ~]# cat .gitconfig [user] name = username email = email [color] ui = true [alias] st = status ci = commit br = branch ck = checkout unstage = reset HEAD last = log -1 lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit ? 參考鏈接: https://www./wiki/0013739516305929606dd18361248578c67b8067c8c017b000 https://github.com/hongiii/gitNotes_from_Liao/blob/master/gitNotes_from_Liao.md#工作區(qū)暫存區(qū)和版本?%9 https://www.jianshu.com/p/4a8f4af4e803 ? 來源:http://www./content-4-169701.html |
|