文章目录
git和idea
git基础与实操
简介
-
diff与patch
- diff用于比较源文件和目标文件之间的差异
- diff -u left.c right.c
- diff的结果可以保存,patch用于反向操作,通过源文件求出目标文件或者通过目标文件转化成源文件
- patch left.c diff.txt
- path -R right.c diff.txt
- diff用于比较源文件和目标文件之间的差异
-
集中式和分布式的区别
- 哪个更适合?
- svn不适合
- 跨地域的协同开发
- 对代码的高质量追求和代码门禁
- git不适合的领域
- 并不适合word等二进制文档的版本控制,因为git无锁定和解锁模式,不能排他式修改,不能将读授权到目录级别
- 解决方案,将版本库按照目录划分
- svn不适合
git安装与配置
-
linux下,乌班图,debian
sudo aptitude install git
sudo aptitude install git-doc git-svn git-email gitk
- 其中git为必装的软件包
- 剩下的有着不同的依赖,单独作为软件包发布
-
红帽,centos等
yum install git
yum install git-svn git-email gitk
-
从源码安装
- 访问git官方网站,http://git.scm.com/ 下载源码包,如git-2.19.0.tar.gz,下面对此进行解压
tar -jxvf git-2.19.0.tar.bz2
对应着不同的linux解压方法cd git-2.19.0
- 安装方法在INSTALL文件中,参照其中的指示,将git安装在/usr/local/bin中
make prefix=/usr/local all
sudo make prefix=/usr/local install
- 安装git文档
make prefix=/usr/local doc info
sudo make prefix=/usr/local install-doc install-html install-info
- 访问git官方网站,http://git.scm.com/ 下载源码包,如git-2.19.0.tar.gz,下面对此进行解压
-
命令补齐
-
将git源码包中的命令补齐脚本复制到bash-completion目录中
cp contrib/completion/git-completion.bash /etc/bash_completion.d/
-
重新加载自动补齐脚本,使在当前shell中生效
./etc/bash_completion
-
开启自动加载补齐脚本,在~/.bash_profile或者全局文件/etc/bashrc文件中添加内容
-
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
-
-
git 基本命令
-
git的三种工程区域
-
版本库(Repository)
隐藏目录.git文件夹,这个文件夹中就是git的版本库,也可叫做本地仓库
-
工作区(Working Directory)
日常工作的代码文件或者文档所在的文件夹
-
暂存区(stage)
一般在.git/index中,也可把暂存区称之为索引
-
-
git的三种文件状态
-
已提交(committed)
该文件已经被保存在本地仓库中了
-
已修改(modified)
修改了某个文件,但是还没有提交保存
-
已暂存(staged)
把已经修改的文件放在下次提交要保存的清单中
-
-
git常用命令
本地基本提交和推送
- 新建远端工程:右上角new project
-
- private 私密性较高,通常给个人
- internal可以给公司其他人使用
- public 一般不推荐
- 可选择是否自动添加readme.md文件
- windows下打开git bash,是一个在windows下模拟的linux交互器
- 在新建gitlab新项目之后,会有一个clone命令,复制即可
- 使用linux命令可以进入新建的工程目录下,使用ls看不到,因为有隐藏文件,如果用ls -a,就可以看到
- 当然,这里的git为隐藏文件
-
写入一个readme文件:echo “readread” >> README.md
-
但是写进去的文件没有被git跟踪,可用命令git status
很明显,这里的read.md属于未被tracked 的文件,也就是说并没有被commit。下面提示使用了git add来是git对文件进行跟踪
-
输入命令
git add READ.md
,可见已经被git tracked,但是根据提示,to be committed,证明到目前为止还是没有提交,只是让git对该文件进行了管理和跟踪
-
git commit READ.md -m "first test"
进行代码的提交,这里-m表示message,为了区分每一次提交,这里都会有一个特别的描述来表明这一次提交 -
git branch
可以查看目前有几个分支,带*号的为当前工作区 -
commit 一定会有日志
- 搭配命令
git log --name-status
- 搭配命令
-
推送远端服务器
git push origin master
- 这个origin是什么,就是远端服务器的名称,可通过
git remote
查看
- 这个origin是什么,就是远端服务器的名称,可通过
本地分支上开发与日志查看
- 对于多个文件想要进行commit,可通过
git add .
来一次性add所有文件或者文件夹,可通过git status
实时查看 git commit -am "new added file"
-a 表示全部都commit,-m表示mesage,这样可以同时全部进行commitgit commit --amend
可对最近一次的提交进行修改,可以修改提交描述,但是新提交的是会有新的版本号- 切换分支,
git checkout -b linmu/test1
,将当前的分支切到新的分支上去 git log -1
查看最近一条的日志
本地基本分支合并
-
git branch -r
可查看远端的分支数,git branch -a
可查看所有的分支 -
git merge 和 git rebase,参考git rebase 和 git merge 的区别 - 简书 (jianshu.com)
- merge
git checkout feature
git merge master
或者git merge master feature
- 自动创建新的commit,在feature的git上产生一个新的commit
- 优点:记录了真实的commit情况,包括每个分支的详情
- 缺点:每次merge会产生一个merge commit,会使得分支很杂乱
- rebase本质是变基,也就是寻找公共祖先
git checkout feature
git rebase master
- 特点:合并之前的commit历史
- 优点:得到更加简洁的项目历史,去掉了merge commit
- 缺点:合并出现代码问题不容易定位,因为重写了历史
- merge
-
git pull = git fetch+git merge
git fetch
不进行merge,比较温和,只是把远端的拉到本地,后期可以使用git checkout feature
分支合并过程中的冲突处理
-
git branch
查看分支 -
冲突场景
-
当进行merge的时候发生冲突
-
- 我们对于两个不同分支,写入了不同的内容,在这种情况下依然进行merge。在文件中显示了冲突的场景,此时保留其中一个,并删除其他的即可。命令模式下dd可快速删除
-
这里进行
git status
可以提示进行git add
来标记已解决 -
进行
git commit
-am “,”
-
-
补充命令
git log
可以获得几个哈希值,版本哈希值git diff commit哈希 哈希
可以比较两个修改内容之间的提交差异
本地撤销操作
gut reset --hard 哈希值
,恢复到之前的状态,因为它没有询问,所以是非常危险的git checkout READ.md,工作区未提交的还原
git reflog
,可以查看使用git所用到的一些命令
代码平台
代码平台添加ssh公钥
-
登录平台后,选择一个仓库,在右上角进行克隆。使用ssh公钥和代码平台进行通信。
-
在gitlab的右上角的setting->左侧栏SSH keys->生成ssh keys
-
按照步骤,在自己本地生成ssh key,将生成的公钥复制到代码平台的ssh设置中。
创建组织和仓库
- 右上角new group,把相关性高的项目放到这个group中
- 左侧栏中的members可以添加成员,并设置这些成员的权限
- settings可以修改组名称
- new project可以新建仓库
- 复制clone命令,在文件夹中打开git bash,粘贴克隆命令,就可以将仓库下载到本地
fork仓库并创建merge request
-
通常不允许直接文件夹并且push,更推荐使用fork的方法
-
具体步骤
- 点击fork
- 选择namespace,一般选择个人,也即是自己
- 接下来fork会在自己的名下,创建同名的仓库
- 克隆到本地
-
在本地添加一些文件,并打开git bash
git add .
将全部文件添加git commit -am "new files"提交
git push origin HEAD:master
push到远端仓库
-
在个人仓库可以显示已经添加的文件
- 添加merge
- new merge request,选择原分支和目标分支
- 点击
在这里会出现各种commit的信息,包括区别,差异等等
4. assignee可以指定代码的审视人
解决merge request冲突
-
gitlab在线解决冲突,如图已经产生了冲突
- 点击解决冲突
- 可以选择使用我们的,还是别人的
- 冲突解决后,会产生一个新的commit
-
线下冲突解决
- 我们将一个文件删除,但是分支对这个文件进行了修改
- 方法:
1.
ISSUE
指派issue可以分给某个人,用老跟踪项目