头部背景图片
小畅童鞋的学习笔记 |
小畅童鞋的学习笔记 |

Git基本用法

Github是一个远程仓库,上传下载文件都需要运用到Git命令,让我们学习一下怎么运用Git吧~
本站只是对Github进行简要概括,方便运用时查找,如果想要加深一步学习,可以去廖雪峰Git教学网站上进行学习哦~

什么是Git命令?

Git是目前世界上最先进的分布式版本控制系统(没有之一)。
Git有什么特点?简单来说就是:高端大气上档次!

集中式版本控制系统(如CVS和SVN) :版本库是集中存放在中央服务器的,工作时从版本库下载,修改后重新上传版本库,完整的版本库保存在中央服务器,集中式版本控制系统最大的毛病就是必须联网才能工作。
分布式管理系统(如Git) :每个人电脑里都会有完整的版本库,只推送修改即可,不必联网。
Git的优势不单是不必联网这么简单,Git极其强大的分支管理,把SVN等远远抛在了后面。

Git的工作描述图如下:

一.版本管理

1)git init创建版本库,初始化本地仓库

什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。通过git init命令把这个目录变成Git可以管理的仓库:

$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/

2)git add 将修改好的文件上传到版本库

$ git add readme.txt
$ git add file2.txt file3.txt              //可同时添加多个文件

3)git commit 将修改好的文件上传到仓库

-m参数后面输入的是本次提交的说明

$ git commit -m "wrote a readme file"    
[master (root-commit) eaadf4e] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt

4)git status 命令可以让我们时刻掌握仓库当前的状态

$ 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.txt

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

5)git diff 命令可以查看具体修改内容

$ git diff readme.txt 
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.

6)git log 命令可以查看近期提交日志,可以获取commit id

加上--pretty=oneline参数可省去多余的信息

$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Lililich <lililich94@163.com>
Date:   Fri May 18 21:06:15 2018 +0800

    wrote a readme file

7)git reset 命令进行版本回退

HEAD表示当前版本,上一个版本就是HEAD^,往上100个版本写成HEAD~100;也可以用commit id来进行版本回退

$ git reset --hard HEAD^
HEAD is now at e475afc add distributed
$ git reset --hard 1094a
HEAD is now at 83b0afe append GPL

8)git relog 命令用来记录每一次命令,方便查找commit id

$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file

9)git checkout 命令用来撤销修改

--很重要,没有--,就变成了“切换到另一个分支”的命令

//若修改仅保存在工作区,可直接撤销修改
$ git checkout -- readme.txt
//若已经git add到了暂存区,先将暂存区版本撤销再丢弃工作区修改
$ git reset HEAD readme.txt
$ git checkout -- readme.txt
//若已经git commit到了远程仓库,直接进行版本回退
$ git reset --hard HEAD^

10)git rm 命令用来删除文件

删除版本库文件先git rmgit commit提交

$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
$ git checkout -- test.txt   //还可以将误删的文件从版本库还原

11)git remote add 命令把本地仓库与GitHub远程仓库相关联

$ git remote add origin git@github.com:lililich/learngit.git

12)git push命令把本地当前分支master推送到远程

-u参数代表Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令

$ git push -u origin master          
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 1.64 KiB | 560.00 KiB/s, done.
Total 20 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:lililich/learngit.git
* [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

13)git clone命令用于从远程库克隆代码

$ git clone git@github.com:lililich/gitskills.git
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Receiving objects: 100% (3/3), done.

二.分支管理

1)git checkout命令用来创建并切换分支

$ git checkout -b dev           //用来创建并切换分支,相当于以下两条命令
Switched to a new branch 'dev'
$ git branch dev                //创建分支
$ git checkout dev              //切换分支

2)git branch命令用来命查看当前分支

命令会列出所有分支,当前分支前面会标一个*号

$ git branch
* dev                       
master

3)git merge命令用于合并指定分支到当前分支

$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)

4)git branch命令也用于创建和操作分支

不加参数git branch <name>表示创建分支,加上参数git branch -d <name>用于删除分支,git branch -D <name>用于删除一个还未被合并过的分支

$ git branch -d dev        
Deleted branch dev (was b17d20e).
$ git branch -D feature-vulcan
Deleted branch feature-vulcan (was 287773e).

5)git log --graph命令用于查看分之合并情况

当Git无法自动合并分支时,就必须首先解决冲突。git status查看冲突文件,解决冲突后,再提交,合并完成。合并完成用git log --graph命令也用于查看分之合并情况

$ git log --graph --pretty=oneline --abbrev-commit
*   cf810e4 (HEAD -> master) conflict fixed
|\  
| * 14096d0 (feature1) AND simple
* | 5dc6824 & simple
|/  
* b17d20e branch test
* d46f35e (origin/master) remove test.txt

6)git merge --no-ff命令用于表示禁用Fast forward,

--no-ff参数表示使合并后的历史有分支,能看出曾做过合并
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 +
1 file changed, 1 insertion(+)

7)git stash命令用于处理Bug分支

$ git stash            //存储当前工作现场,等改完Bug再恢复
Saved working directory and index state WIP on dev: f52c633 add merge
$ git stash list          //查看stash内容列表
stash@{0}: WIP on dev: f52c633 add merge
$ git stash pop         //恢复现场的同时把stash内容也删了,相当于以下两条语句
$ git stash apply       //恢复现场,但是恢复后,stash内容并不删除
$ git stash drop        //删除stash内容

8)git remote命令用于处理多人协作问题

$ git remote         //查看远程库的信息
origin
$ git remote -v       //显示更详细的信息

9)git pull命令用于把最新的提交从origin/dev抓下来

用于当你的小伙伴的最新提交和你试图推送的提交有冲突时,先用git pull命令用于把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送

$ git branch --set-upstream-to=origin/dev dev              //先建立本地dev分支与远程origin/dev分支的链接
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
$ git pull                       //将远程库最新更新抓取下来
Auto-merging env.txt
CONFLICT (add/add): Merge conflict in env.txt
Automatic merge failed; fix conflicts and then commit the result.

9)git rebase命令用于解决历史记录分叉的问题

$ git rebase

三.标签管理

1)git tag命令用来创建和删除标签

$ git tag v1.0         //创建标签
$ git tag              //查看标签
v1.0
$ git tag v0.9 f52c633        //给commit id已知的提交创建标签
$ git tag -a v0.1 -m "version 0.1 released" 1094adb   //创建带有说明的标签
$ git tag -d v0.1             //删除标签
Deleted tag 'v0.1' (was f15b0dd)

2)git show命令用来查看标签信息

$ git show v0.9
commit f52c63349bc3c1593499807e5c8e972b82c8f286 (tag: v0.9)
Author: Lililich <lililich94@163.com>
Date:   Fri May 18 21:56:54 2018 +0800

    add merge

diff --git a/readme.txt b/readme.txt
...

3)git push命令用来推送标签

$ git push origin --tags         //一次性推送全部尚未推送到远程的本地标签
Total 0 (delta 0), reused 0 (delta 0)
To github.com:michaelliao/learngit.git
* [new tag]         v0.9 -> v0.9
$ git tag -d v0.9                         //先把标签从本地删除
Deleted tag 'v0.9' (was f52c633)
$ git push origin :refs/tags/v0.9          //再把标签从远程库删除
To github.com:michaelliao/learngit.git
- [deleted]         v0.9
Lililich's Blog