git相关使用
git开发示例
获取代码/获取最新代码$ git clone http://192.168.100.249/root/shop.git //克隆代码,此处url为测试地址,工作中请更改为实际地址。如果你本地已经有代码,在开发新功能之前你应该获取最新状态$ git pull //拉取最新代码

创建dev分支来进行开发工作$ git checkout -b dev

dev分支开发在正常推进中,已完成某一部分功能开发,此时做了一次提交:$ git add . //将所有修改添加到暂存区,可能你只想提交部分已修改的文件,此时你可以使用$ git add File1 File2可以多文件,文件名之间空格分隔即可,当然也有可能永远都不想提交某个文件了,此时你可以看这里(忽略文件)$ git commit -m "已完成功能的A模块" //提交更新到本地仓库
突然接到电话,有个紧急问题等待你来解决,于是我们切换回master分支,创建一个新分支来处理紧急问题,前提你需要保持工作区是一个干净的状态,有一些方法可以绕过这个问题 (即,暂存(stashing) 和 修补提交(commit amending)),现在,我们假设你已经把你的修改全部提交了,这时你可以切换回 master 分支了:$ git checkout master
紧接着我们所要做的就是创建一个居于master的分支来解决紧急问题:$ git checkout -b debug

很快,问题就被修复,此时我们需要将修复后的代码合并到master来,将最新的master分支推送到远端:$ git checkout master$ git merge debug$ git push

处理完紧急事件,我们需要删除无用的分支,回到原来的分支继续工作,并完成另外一些功能:$ git checkout dev$ git branch -d debug
……. //开发ing$ git add .$ git commit -m "**功能开发完成"

你在 debug 分支上所做的工作并没有包含到 dev 分支中。 如果你需要拉取 debug 所做的修改,你可以使用 git merge master 命令将 master 分支合并入 dev 分支,或者你也可以等到 dev 分支完成,再将其合并回 master 分支。我们假设你已经开发完成,现在合并到master:$ git checkout master$ git merge dev
Auto-merging index.htmlCONFLICT (content): Merge conflict in index.htmlAutomatic merge failed; fix conflicts and then commit the result.
有时候合并操作不会如此顺利。 如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们。当有合并冲突产生时, Git 做了合并,但是没有自动地创建一个新的合并提交。 Git 会暂停下来,等待你去解决合并产生的冲突。 你可以在合并冲突后的任意时刻使用 git status 命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件:$ git status
$ git statusOn branch masterYou have unmerged paths.(fix conflicts and run "git commit")Unmerged paths:(use "git add <file>..." to mark resolution)both modified: index.htmlno changes added to commit (use "git add" and/or "git commit -a")
任何因包含合并冲突而有待解决的文件,都会以未合并状态标识出来。 Git 会在有冲突的文件中加入标准的冲突解决标记,这样你可以打开这些包含冲突的文件然后手动解决冲突。 出现冲突的文件会包含一些特殊区段,看起来像下面这个样子:
<<<<<<< HEAD<div id="footer">contact : email.support@github.com=======<div id="footer">contact : email.support@github.com>>>>>>> c85de86e9d93467711cc90a169911f370dd5ea1f</div>f
<<<<<<< HEAD 与 =======之间内容为本地分支内容,======= 与 >>>>>>> 之间为远程分支内容,c85de86e9d93467711cc90a169911f370dd5ea1f为此文件在远程分支最后提交的commit_id
假设我们将文件内容修改为:
<div id="footer">contact : email.support@github.com</div>
此时我们git status查看一下:
On branch masterYour branch and 'origin/master' have diverged,and have 1 and 1 different commits each, respectively.(use "git pull" to merge the remote branch into yours)You have unmerged paths.(fix conflicts and run "git commit")(use "git merge --abort" to abort the merge)Unmerged paths:(use "git add <file>..." to mark resolution)both modified: index.htmlno changes added to commit (use "git add" and/or "git commit -a")
git还不知道我们已经处理了冲突,现在我们需要通知git冲突已经被解决:$ git add index.html$ git status
On branch masterYour branch and 'origin/master' have diverged,and have 1 and 1 different commits each, respectively.(use "git pull" to merge the remote branch into yours)All conflicts fixed but you are still merging.(use "git commit" to conclude merge)
git告诉说我们已处理全部冲突,现在需要用git commit来结束合并,当然我们还得将合并后的信息推送到远端$ git commit -m "**功能开发完成"$ git push
现在我们需要删除dev分支,因为它已经用不到了$ git branch -d dev
至此,整个开发流程完成,现在分支结构是这样的:
请忽略c0-c5的顺序,它们只是commit_id
代码拉取
git clone http://192.168.100.103/root/shop.git
代码提交
git add filename //提交指定文件修改到暂存区git add . //提交所有文件的修改到暂存区git commit -m "这里是版本提交的说明信息" //本地版本提交(将暂存区的内容提交到本地版本库,会产生commit_id,用于版本回退等)git push //提交代码到远端服务器
分支合并及冲突解决
//如果需要将master分支合并到dev分支,确保代码为最新,合并的分支都需要重新拉取最新代码git checkout mastergit pullgit checkout devgit pullgit merge master -m "merge master into dev"//当有冲突时git status 查看冲突文件,手动修改冲突文件来解决冲突,提交修改后的冲突文件完成mergegit add conflict_file 或者 git add .git commit
代码比对
git diff filename//查看工作目录文件修改前后差别(还未add到暂存区)git diff filename//查看add进暂存区但未commit的文件与上一次commit的差别git diff master fileame//比对当前分支与master分支上filename文件差别git diff <commit_id> filename//对比工作目录与commit_id版本(commit_id提交之后)之间的文件差异git diff <commit_id> <commit_id>//对比两个commit_id版本之间的差别git diff HEAD^ filename//对比filename文件与上一个版本之间的差别
开发示例
---创建新分支进行项目开发---git clone http://192.168.100.103/root/shop.git //拉取gitlab服务器项目代码cd shop //进入项目目录git branch dev //创建开发分支git checkout dev //切换到开发分支进行开发工作git add filename //添加单文件到暂存区 或 git add . //添加所有修改到暂存区git commit -m "新增文件filename" //代码提交到本地版本仓库git push --set-upstream origin dev //提交分支代码到远程仓库,会在远程仓库添加分支信息,当新分支第一次push时需要做此操作与远程仓库关联git push //已关联的分支直接push即可git checkout master //切换到master分支git pull //获取master分支最新代码git checkout dev //切换回开发分支git merge master -m "合并最新master代码到**开发分支" //将master代码合并到dev分支(开发过程中master分支可能已更改或者其他开发分支已合并到master分支)//此处合并可能会有冲突,解决方法查看冲突解决本分文档---当开发测试完成,需要将开发分支代码合并到主分支---git checkout dev //切换到开发分支git pull //获取最新代码git checkout master //切换到master分支git pull //获取最新代码git merge dev -m "**功能合并到主分支" //将dev分支代码合并到master分支//此处可能需要处理文件冲突//代码提交测试环境进行测试//代码上线
标签
标签可以理解为commit_id的别名git tag //标签列表git show tag_name //查看指定标签详细信息,可以看到commit_id别名git tag tag_name //创建标签git tag -d tag_name //删除标签git push origin tag_name //将标签推送到远端服务器git push origin --tags //一次推送本地所有标签到远端服务器git push origin :refs/tags/tag_name //删除远端服务器标签git checkout tag_name //回退到指定标签版本
git stash(保存当前工作进度,将工作区和暂存区恢复到修改之前)
有时候项目开发未完成,但需要优先处理一些其他事宜,比如需要先修复bug等,此时如果将代码commit显然不合适,此时stash可以帮忙。它将隐藏工作暂存区更改。让你的工作区看起来是干净的。注意:只有添加到版本管理的文件才能使用stash,比如你新增的文件,必须先git add file_name 到版本控制后stash才能识别它。git stash save "这是说明信息" //添加stashgit stash list //查看stash列表git stash pop //恢复存储的最后一个stash工作场景场,并删除stash条目git stash apply stash@{num} //恢复到指定的工作场景,num为git stash list看到的内容,此操作不会删除stash内容,需要手动删除git stash drop stash@{num} //删除指定的stash
常见问题
1. 远端分支已被删除,本地还存在远程分支信息$ git fetch -p或者$ git prune remote origin
2. 看不到别人创建的分支信息$ git remote //先查看远程仓库名称,此处以origin为例$ git fetch origin //获取远程仓库全部最新内容$ git branch -a //此时应该可以看到想要的远程分支了$ git checkout branch_name //此时可以切换到想要的分支了
3.切换分支发现互相影响(切换分支后git status看到的内容是一样的).
两种方法:
1. git stash //隐藏当前工作现场,比如我们要将未开发完成的项目放一放,去处理一些bug,这里以dev分支为例git checkout devgit stash save "这里是一些说明信息"git status //如果stash创建成功,可以看到工作区是干净的git checkout -b dev_bug //此时创建bug分区并切换到分支进行工作即可2.git add & git commit //将修改内容提交即可git add .git commit -m "我要去修bug,稍后回来"git checkout -b dev_bug //此时创建bug分区并切换到分支进行工作即可
4. 解决冲突
常见场景场:1.使用git pull来更新远端代码时2.分支merge时代码冲突3.git fetch & git merge时冲突的场景可以有很多,但是解决冲突的办法都一样:1. git status //查看工作区状态2. 手动解决冲突的文件3. git add . //将解决的文件添加到暂存区4. git commit -m "说明" //提交已解决的文件,告诉git冲突以及处理5.git push //将最新代码同步到远端
git忽略文件
忽略文件分两种情况:
一.文件未入库(未添加到版本控制)
在仓库目录下新建一个名为”.gitignore”的文件(以.开头为隐藏文件,如果你看不到文件,请更改设置来显示隐藏文件),”.gitignore”文件对其所在的目录及所在目录的全部子目录均有效。通过将.gitignore文件添加到仓库,其他开发者更新该文件到本地仓库,以共享同一套忽略规则,在项目初期,我们会添加.gitignore来排除一些需要永久排除的文件或者目录。下面是”.gitignore”文件配置语法:
#以'#'开始的行,被视为注释.#忽略掉所有文件名是 foo.txt的文件.foo.txt#忽略所有生成的 html文件*.html#foo.html是手工维护的,所以例外.!foo.html#忽略所有.o和 .a文件.*.[oa]#仅忽略当前目录下的config.php,其他目录下的config.php不会被忽略/config.php#忽略build文件夹下的所有文件,但不包括build文件夹本身build/#忽略 doc/haha.txt, 不包括 doc/server/haha.txtdoc/*.txt#忽略 doc/下所有的 .pdf 文件doc/**/*.pdf代表任意多层上级目录,此条目将忽略所有目录结构包含"/bin/Debug"的Debug目录下的所有内容**/bin/Debug/
二. 文件已入库(已在版本库中)
有时候我们要临时忽略已存在于本版库中的指定文件提交请求信息,我们可以使用:$ git update-index --assume-unchanged file_path
重新添加到版本管理中$ git update-index --no-assume-unchanged file_path
注意:这种方法只会忽略你本地仓库对特定文件的提交信息,并不会影响到其他开发人员对文件的操作(此文件在他们本地仓库,可修改,可提交,可push到远端)
创建合并请求
1.登录gitlab(略)
2.创建合并请求
3.选择分支

4.填写信息并提交

浙公网安备 33010602011771号