Git是目前世界上最先进的分布式版本控制系统。
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
工作区:就是你在电脑里能看到的目录。
暂存区:英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。工作区的文件先被增加到这个区域里,再从这个区域提交到版本库。
版本库:工作区有一个隐藏目录.git,这个不是工作区,而是Git的版本库。
[root@localhost ~]# cat /etc/issue
CentOS release 6.9 (Final)
Kernel \r on an \m
linux上作为我的git服务器
我这里使用的yum安装[root@localhost ~]# yum install git
也可以使用源码安装,需要安装很多依赖包
yum install curl-devel expat-devel gettext-devel \
openssl-devel zlib-devel
$ tar -zxf git-2.0.0.tar.gz
$ cd git-2.0.0
$ make configure
$ ./configure --prefix=/usr
$ make all doc info
$ sudo make install install-doc install-html install-info
获取git版本,安装成功
[root@localhost ~]# git version #git版本
git version 1.7.1
git安装好后,创建 git 用户,用来管理 Git 服务,并为 git 用户设置密码
[root@localhost ~]# useradd git
[root@localhost ~]# passwd git
禁止 git 用户 ssh 登录服务器,修改/etc/passwd文件git:x:500:500::/home/git:/usr/bin/git-shell
[root@localhost repository]# ll -a
drwxr-xr-x. 8 root root 4096 1月 8 17:35 .git
[root@localhost ~]# git config --list
user.name=xxx
user.email=xxx@qq.com
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
......
想要他们连接的话要创建证书登录
收集所有需要登录的用户的公钥,公钥位于id_rsa.pub文件中,把我们的公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
打开windows的git bash,输入ssh-keygen -t rsa -C “邮箱”,生成ssh私钥和公钥
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
保存并重启 sshd 服务:[root@localhost ssh]# /etc/rc.d/init.d/sshd restart
[root@localhost git]# pwd
/home/git
[root@localhost git]# mkdir .ssh
[root@localhost git]# ls -a
. .. .bash_logout .bash_profile .bashrc .gnome2 .mozilla .ssh
然后把 .ssh 文件夹的 owner 修改为 git,为.ssh和authorized_keys修改权限
[root@localhost git]# chown -R git:git .ssh
[root@localhost git]# chmod 700 .ssh
[root@localhost git]# touch .ssh/authorized_keys
[root@localhost git]#chmod 600 .ssh/authorized_keys
将客户端公钥id_rsa.pub文件的内容写到服务器端 /home/git/.ssh/authorized_keys 文件里
在桌面右键选择tortoiseGit,选择设置,设置用户名和邮箱,跟在git bash是一样的,此时设置的是全局的
编辑一个文件保存,在空白处右键选择TortoiseGit,选择添加,加到暂存区,也就是git add,也可以在下一步里面直接提交
右键选择Git提交,填写日志信息,不然不能提交然后点提交,这一步是将文件提交到你本地的仓库,git中不能提交一个空文件夹,里面一定要有文件才行
第一行默认提交到master分支,也可以选择新建分支,提交到新分支上
没有添加的文件也可以直接提交到版本库,也可以选择不提交未添加的文件
拉取和获取的区别
拉取:git pull 在将远程仓库最新版本拉到本地的同时,将其合并到本地的当前 HEAD 中。
一般选择非fast forward,会多生成一个commit 记录,并强制保留分支的开发记录,不会丢失分支信息,这对于以后代码进行分析特别有用。
获取:git fetch 将远程仓库最新版本拉到本地,不会自动合并 ,绝不会更改任何本地分支
实际使用中 使用git fetch 更安全 在merge之前可以看清楚 更新情况 再决定是否合并
右键TortoiseGit,选择创建分支,填入分支名称,选择在哪个分支上新建分支,如果勾选切换新分支,分支创建后就直接在新分支上工作了,否则在TortoiseGit中选择切换分支
在分支上修改后提交到分支
切换回master分支,TortoiseGit选择合并,选择非快进式合并,合并后master分支上有了其他分支上提交的信息
当主干与分支修改了同一个文件,合并时会产生冲突
打开文件与在命令行中一样,用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
右键TortoiseGit中选择解决冲突
双击该文件进行修改,左边窗口是分支上的内容,右边窗口是master上的内容,你要在下面的窗口上解决冲突,修改正确的文件内容,然后保存,然后将解决后的文件进行提交
红色代表当前分支,绿色代表本地分支,浅×××代表远端分支,×××代表标签
可以看到各版本提交的信息,及分支合并的信息,还有文件的操作状态
颜色可以在设置中更改
可以在每一条信息上右键选择与上一版本比较差异
以上就是TortoiseGit的基本操作了
下面是一些命令行操作
根据需要,后期将会将svn上的数据迁移到git上
使用git init --bare svnrepo.git命令
我是在linux上操作的,算是本地仓库吧,不涉及远程库;在linux上操作与在windows上相同
编辑一个readme.txt文件,将文件加入版本库中[root@localhost repository]# git add readme.txt #将工作区中的文件添加到暂存区了
[root@localhost repository]# git commit -m “提交readme”
-m 是提交信息,便于查看提交了什么东西,这一步是将暂存区中的文件提交到仓库了
[root@localhost repository]# git status
#On branch master
nothing to commit (working directory clean)
这样说明没有任何文件未提交,工作区是干净的
[root@localhost repository]# 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.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
上面的命令告诉我们 readme.txt文件已被修改,但是并没有提交
[root@localhost repository]# git diff
diff --git a/readme.txt b/readme.txt
index 92e045e..d94ee74 100644
--- a/readme.txt
+++ b/readme.txt
@@ -5,4 +5,3 @@
666666
777777
999999
-000
可以看到,少了一行000
知道了对readme.txt文件做了什么修改后,我们可以放心的提交到仓库了,提交修改和提交文件是一样的2步(第一步是git add 第二步是:git commit)。
[root@localhost repository]# git add readme.txt
[root@localhost repository]# git commit -m "readme删除000"
[root@localhost repository]# git log
commit ffc46d25feacd0ae1926ace37efecd116402503e #版本号
Author: bai <xxx@qq.com>
Date: Tue Jan 9 16:49:18 2018 +0800
readme删除000 #最近一次提交内容,也就是commit -m 写的内容
commit 1fac1a93037444bfbd59e51b57c511aaa0a9578f
Author: bai <xxx@qq.com>
Date: Mon Jan 8 11:26:26 2018 +0800
readme增加222222
commit 876477f1b209ba61de4248ff26c2c1a098520295
Author: bai <xxx@qq.com>
Date: Mon Jan 8 11:20:45 2018 +0800
提交readme.txt
如果嫌上面显示的信息太多的话,我们可以使用命令 git log –pretty=oneline
[root@localhost repository]# git log --pretty=oneline
ffc46d25feacd0ae1926ace37efecd116402503e readme删除000
1fac1a93037444bfbd59e51b57c511aaa0a9578f readme增加222222
876477f1b209ba61de4248ff26c2c1a098520295 提交readme.txt
[root@localhost repository]# git reset --hard HEAD^ #回退到上一版本
[root@localhost repository]# git log
commit 1fac1a93037444bfbd59e51b57c511aaa0a9578f
Author: bai <xxx@qq.com>
Date: Mon Jan 8 11:26:26 2018 +0800
readme增加222222
commit 876477f1b209ba61de4248ff26c2c1a098520295
Author: bai <xxx@qq.com>
Date: Mon Jan 8 11:20:45 2018 +0800
提交readme.txt
可以看到删除000的操作没有了
如果想要回退到上上个版本就把HEAD^ 改成 HEAD^^,以此类推
如果想回到100个版本之前的话,就git reset --hard HEAD~100
[root@localhost repository]# git reset HEAD 版本号
[root@localhost repository]# git reflog
19ecf86 HEAD@{0}: HEAD^: updating HEAD
ffc46d2 HEAD@{1}: commit: readme删除000
ffc46d2就是版本号
1.如果已经提交了的话,就直接回退到上一版本
2.如果没有添加到暂存区的话,使用git checkout -- 文件名 撤销工作区的所有修改[root@localhost repository]# git checkout -- readme.txt
3.如果已经添加到暂存区的话,想丢弃修改[root@localhost repository]# git reset HEAD readme.txt
然后再重复第二步
[root@localhost repository]# git rm readme.txt
[root@localhost repository]# git commit -m “删除readme”
[root@localhost repository]# git checkout –b fenzhi
这个命令相当于两条命令
git branch fenzhi 创建分支
git checkout fenzhi 切换到该分支
我们在分支上修改了文件内容提交后,在主分支上是看不到刚才修改的内容的
[root@localhost repository]# git branch
* fenzhi
master
带星号的则代表当前在该分支上
[root@localhost repository]# git checkout master #在master分支上进行合并
[root@localhost repository]# git merge --no-ff fenzhi
在分支上修改内容后,与主分支合并,合并后就统一了文件内容
[root@localhost repository]# git branch -d fenzhi
当你在主分支上和其他分支上修改了同一个文件并且都提交了,当在主分支上合并的时候就会产生冲突
查看文件内容是这样的
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,其中<<< HEAD是指主分支修改的内容,>>>>fenzhi 是指fenzhi上修改的内容
我们可以手动修改文件,解决冲突,然后在提交到版本库
git log --graph --pretty=oneline --abbrev-commit
在开发中,会经常碰到bug问题,那么有了bug就需要修复,每个bug都可以通过一个临时分支来修复,修复完成后,合并分支,然后将临时的分支删除掉。比如我在开发中接到一个404 bug时候,我们可以创建一个404分支来修复它,但是,当前的dev分支上的工作还没有提交。
工作进行到一半时候,我们还无法提交,比如我这个分支bug要2天完成,但是404 bug需要5个小时内完成。怎么办呢?还好,Git还提供了一个stash功能,可以把当前工作现场 ”隐藏起来”,等以后恢复现场后继续工作。
在你需要隐藏的dev分支下执行git stash,这时候虽然dev分支上的内容还没有提交,但是git status看一下工作区是干净的,也就是dev的工作现场被隐藏了
现在创建404分支来修复bug了。首先我们要确定在哪个分支上修复bug,比如我现在是在主分支master上来修复的,现在我要在master分支上创建一个临时分支修复完成后,切换到master分支上,并完成合并,最后删除404分支。
然后我们回到dev分支上干活,工作区是干净的,那么我们工作现场去哪里呢?我们可以使用命令 git stash list来查看下
工作区是干净的,那么我们工作现场去哪里呢?我们可以使用命令 git stash list来查看下。Git把stash内容存在某个地方了,但是需要恢复一下,可以使用如下2个方法:
git stash apply恢复,恢复后,stash内容并不删除,你需要使用命令git stash drop来删除。
另一种方式是使用git stash pop,恢复的同时把stash内容也删除了。