如果多人合作时,git也是需要中间交换服务器来解决冲突合并,这不还是集中式版本控制吗?
而svn不是也可以将所有源码下载到本机,然后在本机修改,保存在本机上,为什么这个不能说是分布式,提交的时候不也是解决冲突合并就ok吗?
git和svn的区别:
https://blog.csdn.net/hellow__world/article/details/72529022
git详细使用说明:
https://my.oschina.net/gsbhz/blog/337719
git使用过程简介:
准备工作
1.下载git,并安装,安装完毕后,桌面空白处上右键,菜单出现Git GUI Here和Git Bash Here既安装成功
2.注册github账号(这一步不是必须,因为本文要配合github使用,所以需要github作为远程仓库)
Git基本常用命令如下:
mkdir: XX (创建一个空目录 XX指目录名)
pwd: 显示当前目录的路径。
git init 把当前的目录变成可以管理的git仓库,生成隐藏.git文件。
git add test.txt 把test.txt 文件添加到暂存区去。
git commit –m “修改bug10879” 提交文件 –m 后面的是注释。
git status 查看仓库状态
git diff test.txt 查看test.txt 文件修改了那些内容
git log 查看历史记录
git reset –hard HEAD^ 或者 git reset –hard HEAD~ 回退到上一个版本
(如果想回退到100个版本,使用git reset –hard HEAD~100 )
cat test.txt 查看test.txt 文件内容
git reflog 查看历史记录的版本号id
git checkout -- test.txt 把test.txt 文件在工作区的修改全部撤销。
git rm test.txt 删除test.txt 文件
git remote add origin http://github.com/username/gittest 关联一个远程库
git push –u origin master (第一次要用-u 以后不需要) 把当前master分支推送到远程库
git push origin master Git会把master分支推送到远程库对应的远程分支上
git clone http://github.com/username/gittest 从远程库中克隆
git checkout –b dev 创建dev分支 并切换到dev分支上
git branch -a 查看当前所有的分支
git checkout master 切换回master分支
git merge dev 在当前的分支上合并dev分支
git branch –d dev 删除dev分支
git branch name 创建分支
git stash 把当前的工作隐藏起来 等以后恢复现场后继续工作
git stash list 查看所有被隐藏的文件列表
git stash apply 恢复被隐藏的文件,但是内容不删除
git stash drop 删除文件
git stash pop 恢复文件的同时 也删除文件
一.git add 和commit 多个文件
1.git add --all
2 git add .
3.git add file1 file2 file3 //用空格分开,文件夹同理
commit的话 ,直接就commit 后面不跟任何东西就是把add的所有文件commit了
二.git 放弃本地更改
如果在修改时发现修改错误,而要放弃本地修改时,
一.未使用 git add 缓存代码时。
可以使用 git checkout -- filepathname (比如: git checkout -- readme.md ,不要忘记中间的 “--” ,不写就成了检出分支了!!)。放弃所有的文件修改可以使用 git checkout . 命令。
此命令用来放弃掉所有还没有加入到缓存区(就是 git add 命令)的修改:内容修改与整个文件删除。但是此命令不会删除掉刚新建的文件。因为刚新建的文件还没已有加入到 git 的管理系统中。所以对于git是未知的。自己手动删除就好了。
二.已经使用了 git add 缓存了代码
git status 先看一下add 中的文件
git reset HEAD XXX.java 就是对某个文件进行撤销了
放弃所有的缓存可以使用 git reset HEAD . 命令
此命令相当于撤销 git add 命令所在的工作。在使用本命令后,本地的修改并不会消失,而是回到了如(一)所示的状态。继续用(一)中的操作,就可以放弃本地的修改
三.git fetch 和git pull
1、git fetch 相当于是从远程获取最新到本地,不会自动merge,如下指令:
git fetch orgin master //将远程仓库的master分支下载到本地当前branch中
git log -p master ..origin/master //比较本地的master分支和origin/master分支的差别
git merge origin/master //进行合并
2. git pull:相当于是从远程获取最新版本并merge到本地,相当于fetch+merage
git pull origin master
四.工作区、暂存区、仓库区、远程仓库
Git本地有四个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、仓库区(Repository或Git Directory)、远程仓库(Remote Directory)。文件在这四个区域之间的转换关系如下:
网上找到一张神图,可以完美的看清四个区的关系
Workspace: 工作区,就是你平时存放项目代码的地方
Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
这个是什么意思:Changes not staged for commit:
git 分为工作区和版本库,工作区是你的代码,版本库就是git记录了
在修改进入版本库前有一个暂存区也叫索引,就是做git add 操作后记录的区域。当commit的时候是将暂存区的记录添加到版本数据库。你的提示说staged没有内容,也就是说你没有执行过add操作
五、记录一次git的pull操作
1.提交本地改动时,使用 git add 和 git commit aaa.text -m "message"
2.然后使用git push origin master 提交到远程主干
3.但是提示fetch first ,原来远程主干上有别人提交过代码,必须先更新
4.使用git fetch orgin master后,再使用git push origin master,依然报错,
大致意思应该是要先把fetch下来的更新merage到本地,此时查看文件夹中的改动,发现还没有变化
5.执行git merge origin/master ,此时查看文件夹,有改动了,把远程的改动已经拉下来了
6.然后再执行git push,发现依然报错,non-fast-forward, 因为虽然merge了,但是这些新的改动没有提交到本地的暂存区,所以得再来一次
7.冲突的文件是aaa.txt,手动修改掉冲突,然后 git add aaa.text ,没问题
git commit aaa.text -m "message" ,报错:can not do a partial commit during a merge(合并期间不能执行部分提交)
8.原来merge时,不能 git commit 具体某个文件,要直接 git commit -m "mask as resolve lalalala......"这样才行
9.commit 后,继续push ,成功!
总结下:
1.push前先fetch +merge 或者pull
2.若有冲突则解决冲突的文件,然后在add,和commit,commit不能跟具体文件
3.最后再push
有的时候我们在进行项目分支合并 git merge 时会出现如下错误
可以按照以下步骤来解决:
- 按键盘上的
“i”
键可进入插入模式 - 这时可以修改最上方的黄色部分,改成你想写的合并原因
- 按键盘上的
“Esc”
键退出插入模式 - 最后在最下面输入
“ :wq ”
后按回车键即可