Git与GitHub的基本使用

                           Git与GitHub的基本使用

                                                  作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.Git的基本使用

1.版本库创建

a>.什么是版本库呢

  版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。现在我们来创建一个git项目(创建一个版本库)

 [root@yinzhengjie ~]# mkdir ProjcetDir   #创建项目
[root@yinzhengjie ~]# cd ProjcetDir/
[root@yinzhengjie ProjcetDir]# ls -a
. ..
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git init #初始化git项目
Initialized empty Git repository in /root/ProjcetDir/.git/
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# ls -a
. .. .git
[root@yinzhengjie ProjcetDir]# ls .git/ #用户git的配置文件,勿动!
branches config description HEAD hooks info objects refs
[root@yinzhengjie ProjcetDir]#

b.把文件添加到版本库

 [root@yinzhengjie ProjcetDir]# touch ReadMe
[root@yinzhengjie ProjcetDir]# mkdir bin conf log
[root@yinzhengjie ProjcetDir]# touch conf/{1.5}.conf
[root@yinzhengjie ProjcetDir]# git status #查看当前目录的状态,可以查出将哪些文件提交给git进行管理。
# On branch master
#
# Initial commit
#
# Untracked files: 这里告诉咱们以下有2个文件没有被跟踪。
# (use "git add <file>..." to include in what will be committed)
#
# ReadMe
# conf/
nothing added to commit but untracked files present (use "git add" to track)
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git add ReadMe #把单个文件提交到stage区域
[root@yinzhengjie ProjcetDir]# git status
# On branch master
#
# Initial commit
#
# Changes to be committed: 这里告诉咱们已经把文件下面的文件给跟踪了
# (use "git rm --cached <file>..." to unstage)
#
# new file: ReadMe
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# conf/
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git add . #把当前目录下的所有文件都提交
[root@yinzhengjie ProjcetDir]# git status
# On branch master
nothing to commit (working directory clean)
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git commit -m "first commit by yinzhengjie" #将文件从stage区提交仓库
[master (root-commit) e9ce735] first commit by yinzhengjie
Committer: root <root@yinzhengjie.(none)>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly: git config --global user.name "Your Name" #第一次提交的时候,这个会告诉咱们需要提交一下自己的用户信息,这里自己安装这个格式提交一下即可。继续往下看,我会给出案例。
git config --global user.email you@example.com If the identity used for this commit is wrong, you can fix it with: git commit --amend --author='Your Name <you@example.com>' files changed, insertions(+), deletions(-)
create mode ReadMe
create mode conf/{1.5}.conf
[root@yinzhengjie ProjcetDir]#

2.GIT回滚

 a>.进行多次提交代码到仓库(目的是创建多个版本库)
[root@yinzhengjie ProjcetDir]# git config --global user.name "yinzhengjie"   #提交git用户信息,因为心细的小伙伴会发现第一次提交的时候会有提示信息.
[root@yinzhengjie ProjcetDir]# git config --global user.email "y1053419035@qq.com" #提交邮箱
[root@yinzhengjie ProjcetDir]# git config --global color.ui true #语法高亮
[root@yinzhengjie ProjcetDir]# git config --list #查看配置信息
user.name=yinzhengjie
user.email=y1053419035@qq.com
color.ui=true
core.repositoryformatversion=
core.filemode=true
core.bare=false
core.logallrefupdates=true
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# echo > ReadMe #修改已经提交到仓库的文件
[root@yinzhengjie ProjcetDir]# touch bin/{..}.go
[root@yinzhengjie ProjcetDir]# git add *
[root@yinzhengjie ProjcetDir]# git init .
Reinitialized existing Git repository in /root/ProjcetDir/.git/
[root@yinzhengjie ProjcetDir]# git commit -m "second commit by yinzhengjie" #第二次进行提交,注意,-m表示在提交时的备注信息,也可以理解是对当前版本的一个说明方便用户自己记忆
[master 39fcee5] second commit by yinzhengjie
files changed, insertions(+), deletions(-)
create mode bin/.go
create mode bin/.go
create mode bin/.go
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# echo "yinzhengjie is good boy" > ReadMe #修改ReadMe文件
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# echo "test commit" >> ReadMe
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# more ReadMe
yinzhengjie is good boy
test commit
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git add *
[root@yinzhengjie ProjcetDir]# git init .
Reinitialized existing Git repository in /root/ProjcetDir/.git/
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git commit -m "third commit by yinzhengjie"
[master d12c571] third commit by yinzhengjie
files changed, insertions(+), deletions(-)
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git log #查看提交日志
commit d12c5714286a81f343ed68fe82406ab72785ea15 #很显然,这是一个md5值,它用来标识当前版本的唯一值,方便用户回滚到该版本。
Author: yinzhengjie <y1053419035@qq.com>
Date: Sat Oct :: + third commit by yinzhengjie commit 39fcee5c7aef367ff2092cfe70715857c36fa21d
Author: yinzhengjie <y1053419035@qq.com>
Date: Sat Oct :: + second commit by yinzhengjie commit e9ce7354d385ca3c454bec7fa885c47fc4a768ed
Author: root <root@yinzhengjie.(none)>
Date: Sat Oct :: + first commit by yinzhengjie
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git log --pretty=oneline #简化输出提交日志记录。
d12c5714286a81f343ed68fe82406ab72785ea15 third commit by yinzhengjie
39fcee5c7aef367ff2092cfe70715857c36fa21d second commit by yinzhengjie
e9ce7354d385ca3c454bec7fa885c47fc4a768ed first commit by yinzhengjie
[root@yinzhengjie ProjcetDir]#

b>.回滚代码到上一个版本

 [root@yinzhengjie ProjcetDir]# git log --pretty=oneline   #查看当前所拥有的版本,很显然共计3个
d12c5714286a81f343ed68fe82406ab72785ea15 third commit by yinzhengjie
39fcee5c7aef367ff2092cfe70715857c36fa21d second commit by yinzhengjie
e9ce7354d385ca3c454bec7fa885c47fc4a768ed first commit by yinzhengjie
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# more ReadMe #查看当前版本的某个文件信息
yinzhengjie is good boy
test commit
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git reset --hard HEAD^ #回滚到上一个版本信息
HEAD is now at 39fcee5 second commit by yinzhengjie
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git log --pretty=oneline
39fcee5c7aef367ff2092cfe70715857c36fa21d second commit by yinzhengjie
e9ce7354d385ca3c454bec7fa885c47fc4a768ed first commit by yinzhengjie
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# more ReadMe #再次查看,发现里面的内容已经回滚到上个版本了 [root@yinzhengjie ProjcetDir]#

c>.回滚到指定版本

 [root@yinzhengjie ProjcetDir]# more ReadMe 

 [root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git log
commit 39fcee5c7aef367ff2092cfe70715857c36fa21d
Author: yinzhengjie <y1053419035@qq.com>
Date: Sat Oct :: + second commit by yinzhengjie commit e9ce7354d385ca3c454bec7fa885c47fc4a768ed
Author: root <root@yinzhengjie.(none)>
Date: Sat Oct :: + first commit by yinzhengjie
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git reset --hard e9ce7354d385ca3c454bec7fa885c47fc4a768ed #回滚到指定版本
[root@yinzhengjie ProjcetDir]# more ReadMe
[root@yinzhengjie ProjcetDir]# git log
commit e9ce7354d385ca3c454bec7fa885c47fc4a768ed
Author: root <root@yinzhengjie.(none)>
Date: Sat Oct :: + first commit by yinzhengjie
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# echo "I'm walking again" >> ReadMe
[root@yinzhengjie ProjcetDir]# git add .
[root@yinzhengjie ProjcetDir]# git commit -m "我又来溜达了"
[master a4c0670] 我又来溜达了
files changed, insertions(+), deletions(-)
[root@yinzhengjie ProjcetDir]# more ReadMe
I'm walking again
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git log
commit a4c067038c901eb6e5cfc7052984fd389cf06d59
Author: yinzhengjie <y1053419035@qq.com>
Date: Sat Oct :: + 我又来溜达了 commit e9ce7354d385ca3c454bec7fa885c47fc4a768ed
Author: root <root@yinzhengjie.(none)>
Date: Sat Oct :: + first commit by yinzhengjie
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git reflog #表示查看所有的日志,包括你回滚的记录的日志
a4c0670 HEAD@{}: commit: 我又来溜达了
e9ce735 HEAD@{}: e9ce7354d385ca3c454bec7fa885c47fc4a768ed: updating HEAD
39fcee5 HEAD@{}: HEAD^: updating HEAD
d12c571 HEAD@{}: commit: third commit by yinzhengjie
39fcee5 HEAD@{}: commit: second commit by yinzhengjie
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git reset --hard 39fcee5 #回滚到指定版本,通过reflog的信息。
HEAD is now at 39fcee5 second commit by yinzhengjie
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git log
commit 39fcee5c7aef367ff2092cfe70715857c36fa21d
Author: yinzhengjie <y1053419035@qq.com>
Date: Sat Oct :: + second commit by yinzhengjie commit e9ce7354d385ca3c454bec7fa885c47fc4a768ed
Author: root <root@yinzhengjie.(none)>
Date: Sat Oct :: + first commit by yinzhengjie
[root@yinzhengjie ProjcetDir]#

 3.撤销修改

a>.工作区和暂存区

  在说撤销修改的操作之前,我个人觉得有必要了解一下原理,我们上面的用到的命令git init,git add 和git commit到底是咋回事,现在我们来进行说明。git的工作机制还是蛮人性化的,为什么要这么说呢?别着急,我们一一揭晓答案。Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。

 先来看名词解释:

   工作目录:

       就是你电脑能任意一个目录都可以称作为工作目录。

   版本库:

       还记得我们上面用的“git init”,没错,就是初始化项目,一旦执行该命令,就会在该工作目录下生成一个隐藏目录“.git”,我们不能称之为它是工作目录,因为我们写代码也不用去编辑它,它就是GIt的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。暂存区我下面会通过2张图来进行解释。

    

b>.将工作去的代码提交至版本库的过程

  我们把文件往Git版本库里添加的时候,是分两步执行的:

  第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区:

                                    Git与GitHub的基本使用

  第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支(注意,一旦执行了这一步操作,就会永久的被git数据库记住,即使你进行回滚操作这个记录也是会存在的,所以说,这一步要慎重操作啊!如果你提交了什么不该提交的数据让你的技术总监发现,它是可以通过命令查看你提交的内容哟~)

                            Git与GitHub的基本使用

c>.撤销修改两种姿势

  我们刚刚已经了解到,当代码从暂存区提交到版本库时数据将被永久的记录下来。即使你可以回滚到上一个版本,但是照样也可以用同样的方式回滚到你所提交的某个状态的版本库中去。所以在提交的时候,你要特别注意提交的内容,最好配合“git status”命令进行查看,一旦你把数据提交到暂存区,只要执行[git commit -m “本次版本的描述”]就会把数据永久的写入到版本库中去。那么当我们及时发现暂存区有的文件内容我们不想要提交该咋搞呢?我们有两种方法:

姿势一:

 [root@yinzhengjie ProjcetDir]# git status
# On branch master
# Changed but not updated: #这行提示可以明显知道是在工作目录
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: ReadMe #这是告诉咱们该工作区域的代码和版本库之前的区别,该文件以及被修改了
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git add ReadMe #把代码从工作目录提交到暂存区
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git status
# On branch master
# Changes to be committed: #由于我们以及把文件提交到暂存区了,需要将数据从暂存区删除,可以执行以下命令,下面以及给的有提示了
# (use "git reset HEAD <file>..." to unstage)
#
# modified: ReadMe
#
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git reset HEAD ReadMe #将文件从暂存区(stage区域)撤回到工作目录
Unstaged changes after reset:
M ReadMe
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git status #再次查看工作目录的状态
# On branch master
# Changed but not updated: #很明显,又回到了工作目录啦~
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: ReadMe
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@yinzhengjie ProjcetDir]#

姿势二:

 [root@yinzhengjie ProjcetDir]# git add ReadMe   #第一次将文件提交到暂存区
[root@yinzhengjie ProjcetDir]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: ReadMe
#
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# echo "I love golang" >> ReadMe #将文件提交到暂存区之后,可以再次编辑提交的文件,我们要做的操作就是再一次提交一下这个文件即可。这种方式比上面那种撤销回再修改之后再次提交更加方便。
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git add ReadMe #再一次提交一下这个文件就好,不过这一次提交的内容会将上一次提交的内容直接覆盖哟~
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: ReadMe
#
[root@yinzhengjie ProjcetDir]#

d>.丢弃工作区

  如果对版本库的文件进行了修改,但是你发现你改的内容把服务给弄崩溃了,这个时候你就很着急啊,咋办呢?当然是感觉把之前的修改给删除啊,换句话说,就是把已经修改且还没有提交的代码丢弃。

 [root@yinzhengjie ProjcetDir]# git status
# On branch master
nothing to commit (working directory clean)
[root@yinzhengjie ProjcetDir]# more ReadMe
http://www.cnblogs.com/yinzhengjie
I am good boy
I love golang
[root@yinzhengjie ProjcetDir]# echo `date +%F` >> ReadMe
[root@yinzhengjie ProjcetDir]# git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: ReadMe
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@yinzhengjie ProjcetDir]# more ReadMe
http://www.cnblogs.com/yinzhengjie
I am good boy
I love golang
--
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git checkout -- ReadMe #把已经修改且没有提交的代码丢弃。
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# more ReadMe
http://www.cnblogs.com/yinzhengjie
I am good boy
I love golang
[root@yinzhengjie ProjcetDir]#

4.删除操作

  删除是有讲究的,一种是你删除了工作目录中的文件,这种情况好解决,只需要从版本库中checkout一份出来即可,另外一种是删除版本库里面的文件,这种方式删除就没法checkout出来啦~如果非要还原文件的话就只能进行回滚操作了!接下来我们一起来实战一下吧。

a>.删除版本库的文件

 [root@yinzhengjie ProjcetDir]# git status
# On branch master
nothing to commit (working directory clean)
[root@yinzhengjie ProjcetDir]# ls -a
, . .. bin conf .git log ReadMe sql
[root@yinzhengjie ProjcetDir]# git rm ReadMe #删除版本库的某个文件,如果是多个的话用空格隔开即可。
rm 'ReadMe'
[root@yinzhengjie ProjcetDir]# ls -a
, . .. bin conf .git log sql
[root@yinzhengjie ProjcetDir]# git commit -m "remove ReadMe file" #将删除的操作进行提交
[master ff06533] remove ReadMe file
files changed, insertions(+), deletions(-)
delete mode ReadMe
[root@yinzhengjie ProjcetDir]#

b>.误删除工作目录文件,需要恢复

[root@yinzhengjie ProjcetDir]# ls -a #查看当前目录所有文件
, . .. bin conf .git log sql
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git checkout -- ReadMe #打算从版本库里面copy一个文件出来,但是报错了,很明显是因为版本库没有该文件。
error: pathspec 'ReadMe' did not match any file(s) known to git.
[root@yinzhengjie ProjcetDir]# git reflog
ff06533 HEAD@{}: commit: remove ReadMe file
79c7e77 HEAD@{}: commit: update
39fcee5 HEAD@{}: 39fcee5: updating HEAD
a4c0670 HEAD@{}: commit: 我又来溜达了
e9ce735 HEAD@{}: e9ce7354d385ca3c454bec7fa885c47fc4a768ed: updating HEAD
39fcee5 HEAD@{}: HEAD^: updating HEAD
d12c571 HEAD@{}: commit: third commit by yinzhengjie
39fcee5 HEAD@{}: commit: second commit by yinzhengjie
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# git reset --hard 79c7e77 #由于现在的版本没有我需要的ReadMe文件,因此我进行了回滚操作。
HEAD is now at 79c7e77 update
[root@yinzhengjie ProjcetDir]# ls -a
, . .. bin conf .git log ReadMe sql
[root@yinzhengjie ProjcetDir]#
[root@yinzhengjie ProjcetDir]# rm -f ReadMe #强制在工作目录中删除一个ReadMe文件
[root@yinzhengjie ProjcetDir]# ls -a
, . .. bin conf .git log sql
[root@yinzhengjie ProjcetDir]# git checkout -- ReadMe #再次从版本库copy该文件,发现成功了~
[root@yinzhengjie ProjcetDir]# ls -a
, . .. bin conf .git log ReadMe sql
[root@yinzhengjie ProjcetDir]#
 二.GitHub的基本使用
1.远程仓库配置
  看过上面的操作,可能你会发现自己已经学会了“git”的提交,删除,撤销,回滚等操作,但是这都不是重点,git更好的地方是提供了远程管理仓库,你可以吧代码提交到世界上的一个网站上去,然后你可以在这个网站上对你的代码进行管理,编辑操作等等,想要学习具体的配置情况,可以参考我的一篇博客:http://www.cnblogs.com/yinzhengjie/p/7017036.html
a>.第一次下载代码到本地
 [root@yinzhengjie yinzhengjie_project]# git clone git@github.com:yinzhengjie/jquery.git   #第一次把代码下载的时候用clone。
Initialized empty Git repository in /yinzhengjie_project/jquery/.git/
remote: Counting objects: , done.
remote: Compressing objects: % (/), done.
remote: Total (delta ), reused (delta ), pack-reused
Receiving objects: % (/), 26.74 MiB | KiB/s, done.
Resolving deltas: % (/), done.
[root@yinzhengjie yinzhengjie_project]# ll
total
drwxr-xr-x root root Oct : jquery
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]#git pull #第二次把代码下载的时候就可以用pull啦~直接把远程的代码拉下来。

b>.提交代码到远程仓库

 [root@yinzhengjie yinzhengjie_project]# git remote add origin git@github.com:yinzhengjie/GOlang.git   #表示添加远程方库的URL
[root@yinzhengjie yinzhengjie_project]# git push -u origin master #表示将本地代码推到远程仓库。
Counting objects: , done.
Writing objects: % (/), bytes, done.
Total (delta ), reused (delta )
To git@github.com:yinzhengjie/GOlang.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# ls -a
. .. download.go .git
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git add .
[root@yinzhengjie yinzhengjie_project]# git commit -m "firsh commit by yinzhengjie"
[master e14aa25] firsh commit by yinzhengjie
files changed, insertions(+), deletions(-)
create mode download.go
[root@yinzhengjie yinzhengjie_project]# git push origin master
Counting objects: , done.
Compressing objects: % (/), done.
Writing objects: % (/), 1.88 KiB, done.
Total (delta ), reused (delta )
To git@github.com:yinzhengjie/GOlang.git
cea2ea3..e14aa25 master -> master
[root@yinzhengjie yinzhengjie_project]#
 
2.分支管理
  在实际工作中,程序员写完代码都会提交到远程仓库,那么远程仓库都是主库(master)吗?很显然,答案是否定的,真正的答案是程序员把每天写的代码的进度都提交到了分支上去了,我在的上家公司是做金融的,我的工作之一就是将开发写的代码通过Jenkins等自动化工具将代码进行打包,然后在交个测试之后,才会把软件包发给技术支持。我依稀的记得当时开发每天会向不同的分支提交代码,我们一天甚至会接到30多次的部署环境的任务.......好了,都过去了,我们说会正题,什么是分支管理?它有什么作用呢?
  我们想一个问题,每个部门都会负责不同的功能,比如处理风控的小组就负责风控的开发和优化,负责前端的程序员就负责写好前端,而且每个小组的每一个程序员负责的具体人物也是不同的,一个软件公司上百人开发一个软件这也是在正常不过的事情了,他们协同开发一个软件,每天都需要敲代码,如果每个人每天提交代码的时候都放在一个库里面,那么很有可能就因为某个程序员提交的代码导致整个程序崩溃了,以至于其他部门的同事没法正常工作了,所以,为了解决这个问题,我们需要采取分支管理。具体的工作流程我们可以参考下图(用系统自带的软件画的,我承认是该学习一下美术了):
 Git与GitHub的基本使用

a>.创建分支并提交

 [root@yinzhengjie yinzhengjie_project]# git branch test   #创建test分支
[root@yinzhengjie yinzhengjie_project]# git branch test2 #创建test2分支
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git branch #查看当前分支
* master
test
test2
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git checkout test #切换分支,如果你用git checkout -b test命令的话就不用在上面创建该分支了,因为这一条命令的-b参数等效于创建并切换。
D jquery
Switched to branch 'test'
[root@yinzhengjie yinzhengjie_project]# echo "//hello world" >> download.go #修改当前目录下的文件
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git add .
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git commit -m "test commit"
[test 3ff1035] test commit
files changed, insertions(+), deletions(-)
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git push origin test #注意在提交的时候不要选择master库拉~而是要选择我们刚刚创建任何一个库即可。这条命令一执行会自动在远程仓库GitHub里面创建一个名称叫做test的分支
Counting objects: , done.
Compressing objects: % (/), done.
Writing objects: % (/), bytes, done.
Total (delta ), reused (delta )
remote: Resolving deltas: % (/), completed with local object.
To git@github.com:yinzhengjie/GOlang.git
* [new branch] test -> test
[root@yinzhengjie yinzhengjie_project]#

Git与GitHub的基本使用

b>.合并分支用法展示

 [root@yinzhengjie yinzhengjie_project]# git branch
master
* test #当前所在分支
test2
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git checkout master #切换分支到master
D jquery
Switched to branch 'master'
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git branch
* master #成功切换到主库啦~
test
test2
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git pull origin master #拉取远程最新的master代码
From github.com:yinzhengjie/GOlang
* branch master -> FETCH_HEAD
Already up-to-date.
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git merge test #在master分支上合并test分支(注意,此时是必须要切换到master库哟)
Updating e14aa25..3ff1035
Fast-forward
download.go | +
files changed, insertions(+), deletions(-)
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git merge test
Updating e14aa25..3ff1035
Fast-forward
download.go | +
files changed, insertions(+), deletions(-)
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git push origin master #把合并后的代码push到远程仓库的master上。
Total (delta ), reused (delta )
To git@github.com:yinzhengjie/GOlang.git
e14aa25..3ff1035 master -> master
[root@yinzhengjie yinzhengjie_project]#

C>.BUG分支(stash)用法展示

  master一般是不会用来开发的,除非你一个人在写代码,可能会直接用master来直接写代码。程序员一般都是在其他分支开发代码的,当然每个程序在写代码的时候难免会出现bug,如果你是负责修复线上bug的程序员,但是你修改的这个分支(如operation分支)需要跟master在下班之前进行合并,这个时候你一看手表,还有30分钟就下班了,窝草,这哪能在30分钟搞定一个bug啊,除非Linus附身。这个时候你想咋办呢?嘿嘿,不要慌,这个时候git有一个神奇的工具,你只需要在命令行中敲击“git stash”就能把当前工作区的代码隐藏起来,以便于你提交当前分支(operation)的代码和主分支(master)进行合并。等你合并完成之后,再把你修改的代码恢复过来,具体案例展示如下:

 [root@yinzhengjie yinzhengjie_project]# pwd
/yinzhengjie_project
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git branch operation ----->创建一个operation分支
[root@yinzhengjie yinzhengjie_project]# git branch development ------>创建一个development分支
[root@yinzhengjie yinzhengjie_project]# git branch ------>查看当前分支
development
* master --------->有"*"号表示当前在master分支
operation
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git checkout operation ----->切换当前分支为operation
Switched to branch 'operation'
[root@yinzhengjie yinzhengjie_project]# git branch ------>再一次查看当前分支
development
master
* operation ------>在operation前面有个*号,说明当前分支为operation。
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# more main.go
package main import "fmt" func main() {
fmt.Println("I'm a main branch")
}
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git status ----->查看工作区状态
# On branch operation
nothing to commit (working directory clean)
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# more main.go -----修改工作区的文件
package main import "fmt" func Bug(s string) {
fmt.Printf("这是一个[%s]漏洞\n",s)
} func main() {
fmt.Println("I'm a main branch")
Bug("video")
} [root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git status ---->修改后再次查看。
# On branch operation
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: main.go
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git checkout master ---->由于修改了内容,因此这里无法切换到主分支去
error: You have local changes to 'main.go'; cannot switch branches.
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git stash ------>把当前的工作区移走。
Saved working directory and index state WIP on operation: 6d94c55 second commit by yinzhengjie
HEAD is now at 6d94c55 second commit by yinzhengjie
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git status ----->再一次查看工作区目录,你会发现当前工作区是干净的。
# On branch operation
nothing to commit (working directory clean)
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git checkout master ---->并且你还可以切换到主分支上去啦~
Switched to branch 'master'
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git branch bug- ----->新建一个bug修复的分支
[root@yinzhengjie yinzhengjie_project]# git branch
bug-
development
* master
operation
[root@yinzhengjie yinzhengjie_project]# git checkout bug- ----->切换到bug分支
Switched to branch 'bug-1'
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# more main.go ----->我们查看里面的代码并发是operation分支的修改的内容。而是master的内容
package main func main(){
fmt.println("I'm a main branch")
}
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git branch
* bug-
development
master
operation
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# more main.go -----我们再次修改bug-1分支的代码
package main import "fmt" func Bug(s string) {
fmt.Printf("这是一个[%s]漏洞\n",s)
} func main() {
fmt.Println("I'm a main branch")
Bug("video")
fmt.Println("这是修复BUG的分支")
} [root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git add .
[root@yinzhengjie yinzhengjie_project]# git commit -m "first commit bug-1" ---->将修改bug-1分支的代码进行提交
[bug- 8df61d7] first commit bug-
files changed, insertions(+), deletions(-)
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git status
# On branch master
nothing to commit (working directory clean)
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git merge bug- ---->合并刚刚我们修改的bug-1分支代码。
Updating 0fc7a55..8df61d7
Fast-forward
main.go | ++++++++++--
files changed, insertions(+), deletions(-)
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git checkout operation ----->代码合并玩之后,现在你又得去写你自己的代码了,需要切换到你的分支
Switched to branch 'operation'
[root@yinzhengjie yinzhengjie_project]# git branch
bug-
development
master
* operation
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# more main.go ----->查看你的分支下的代码,发现之前写的代码不翼而飞啦~不要慌,你下面需要做的就是拿回你之前的数据。
package main import "fmt" func main() {
fmt.Println("I'm a main branch")
}
[root@yinzhengjie yinzhengjie_project]# git status ------>我们在没有回复之前,当前工作区应该是干净的,除非你当前目录下有心的目录或文件没有交给git管理。
# On branch operation
nothing to commit (working directory clean)
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git stash list ----->该命令可以查看之前我们使用git stash命令将工作区移走的具体位置,便于我们恢复当时的代码,下面写的很清楚,是讲我们的代码移到了:stash@{}这个位置,我们需要执行的操作就是恢复那个节点即可。
stash@{}: WIP on operation: 6d94c55 second commit by yinzhengjie
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git stash apply stash@{} ------>恢复当时提交的节点
# On branch operation
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: main.go
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# more main.go ---->查看恢复后的内容
package main import "fmt" func Bug(s string) {
fmt.Printf("这是一个[%s]漏洞\n",s)
} func main() {
fmt.Println("I'm a main branch")
Bug("video")
} [root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git stash list
stash@{}: WIP on operation: 6d94c55 second commit by yinzhengjie
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git stash drop ----->用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;另一种方式是用git stash pop,恢复的同时把stash内容也删啦~
Dropped refs/stash@{} (5e3a45ebb7f78d8510b126c4357f2bf411fb4ccb)
[root@yinzhengjie yinzhengjie_project]#
[root@yinzhengjie yinzhengjie_project]# git stash list ------>删除后再次查看stash 的列表,发现我们之前用stash寸的代码列表以及不存在啦~
[root@yinzhengjie yinzhengjie_project]#

3.忽略特殊文件.gitignore

  有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定不爽。好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

  不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore

忽略文件的原则是:

  1. 忽略操作系统自动生成的文件,比如缩略图等;
  2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
  3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

 

 
 
 
上一篇:@meda媒体查询


下一篇:Codeforce Round #215 Div2 C