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

  1. Auto-merging index.html
  2. CONFLICT (content): Merge conflict in index.html
  3. Automatic merge failed; fix conflicts and then commit the result.

有时候合并操作不会如此顺利。 如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们。当有合并冲突产生时, Git 做了合并,但是没有自动地创建一个新的合并提交。 Git 会暂停下来,等待你去解决合并产生的冲突。 你可以在合并冲突后的任意时刻使用 git status 命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件:
$ git status

  1. $ git status
  2. On branch master
  3. You have unmerged paths.
  4. (fix conflicts and run "git commit")
  5. Unmerged paths:
  6. (use "git add <file>..." to mark resolution)
  7. both modified: index.html
  8. no changes added to commit (use "git add" and/or "git commit -a")

任何因包含合并冲突而有待解决的文件,都会以未合并状态标识出来。 Git 会在有冲突的文件中加入标准的冲突解决标记,这样你可以打开这些包含冲突的文件然后手动解决冲突。 出现冲突的文件会包含一些特殊区段,看起来像下面这个样子:

  1. <<<<<<< HEAD
  2. <div id="footer">
  3. contact : email.support@github.com
  4. =======
  5. <div id="footer">contact : email.support@github.com
  6. >>>>>>> c85de86e9d93467711cc90a169911f370dd5ea1f
  7. </div>
  8. f

<<<<<<< HEAD 与 =======之间内容为本地分支内容,======= 与 >>>>>>> 之间为远程分支内容,c85de86e9d93467711cc90a169911f370dd5ea1f为此文件在远程分支最后提交的commit_id
假设我们将文件内容修改为:

  1. <div id="footer">
  2. contact : email.support@github.com
  3. </div>

此时我们git status查看一下:

  1. On branch master
  2. Your branch and 'origin/master' have diverged,
  3. and have 1 and 1 different commits each, respectively.
  4. (use "git pull" to merge the remote branch into yours)
  5. You have unmerged paths.
  6. (fix conflicts and run "git commit")
  7. (use "git merge --abort" to abort the merge)
  8. Unmerged paths:
  9. (use "git add <file>..." to mark resolution)
  10. both modified: index.html
  11. no changes added to commit (use "git add" and/or "git commit -a")

git还不知道我们已经处理了冲突,现在我们需要通知git冲突已经被解决:
$ git add index.html
$ git status

  1. On branch master
  2. Your branch and 'origin/master' have diverged,
  3. and have 1 and 1 different commits each, respectively.
  4. (use "git pull" to merge the remote branch into yours)
  5. All conflicts fixed but you are still merging.
  6. (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

代码提交

  1. git add filename //提交指定文件修改到暂存区
  2. git add . //提交所有文件的修改到暂存区
  3. git commit -m "这里是版本提交的说明信息" //本地版本提交(将暂存区的内容提交到本地版本库,会产生commit_id,用于版本回退等)
  4. git push //提交代码到远端服务器

分支合并及冲突解决

  1. //如果需要将master分支合并到dev分支,确保代码为最新,合并的分支都需要重新拉取最新代码
  2. git checkout master
  3. git pull
  4. git checkout dev
  5. git pull
  6. git merge master -m "merge master into dev"
  7. //当有冲突时
  8. git status 查看冲突文件,手动修改冲突文件来解决冲突,提交修改后的冲突文件完成merge
  9. git add conflict_file 或者 git add .
  10. git commit

代码比对

  1. git diff filename
  2. //查看工作目录文件修改前后差别(还未add到暂存区)
  3. git diff filename
  4. //查看add进暂存区但未commit的文件与上一次commit的差别
  5. git diff master fileame
  6. //比对当前分支与master分支上filename文件差别
  7. git diff <commit_id> filename
  8. //对比工作目录与commit_id版本(commit_id提交之后)之间的文件差异
  9. git diff <commit_id> <commit_id>
  10. //对比两个commit_id版本之间的差别
  11. git diff HEAD^ filename
  12. //对比filename文件与上一个版本之间的差别

开发示例

  1. ---创建新分支进行项目开发---
  2. git clone http://192.168.100.103/root/shop.git //拉取gitlab服务器项目代码
  3. cd shop //进入项目目录
  4. git branch dev //创建开发分支
  5. git checkout dev //切换到开发分支进行开发工作
  6. git add filename //添加单文件到暂存区 或 git add . //添加所有修改到暂存区
  7. git commit -m "新增文件filename" //代码提交到本地版本仓库
  8. git push --set-upstream origin dev //提交分支代码到远程仓库,会在远程仓库添加分支信息,当新分支第一次push时需要做此操作与远程仓库关联
  9. git push //已关联的分支直接push即可
  10. git checkout master //切换到master分支
  11. git pull //获取master分支最新代码
  12. git checkout dev //切换回开发分支
  13. git merge master -m "合并最新master代码到**开发分支" //将master代码合并到dev分支(开发过程中master分支可能已更改或者其他开发分支已合并到master分支)
  14. //此处合并可能会有冲突,解决方法查看冲突解决本分文档
  15. ---当开发测试完成,需要将开发分支代码合并到主分支---
  16. git checkout dev //切换到开发分支
  17. git pull //获取最新代码
  18. git checkout master //切换到master分支
  19. git pull //获取最新代码
  20. git merge dev -m "**功能合并到主分支" //将dev分支代码合并到master分支
  21. //此处可能需要处理文件冲突
  22. //代码提交测试环境进行测试
  23. //代码上线

标签

  1. 标签可以理解为commit_id的别名
  2. git tag //标签列表
  3. git show tag_name //查看指定标签详细信息,可以看到commit_id别名
  4. git tag tag_name //创建标签
  5. git tag -d tag_name //删除标签
  6. git push origin tag_name //将标签推送到远端服务器
  7. git push origin --tags //一次推送本地所有标签到远端服务器
  8. git push origin :refs/tags/tag_name //删除远端服务器标签
  9. git checkout tag_name //回退到指定标签版本

git stash(保存当前工作进度,将工作区和暂存区恢复到修改之前)

  1. 有时候项目开发未完成,但需要优先处理一些其他事宜,比如需要先修复bug等,此时如果将代码commit显然不合适,此时stash可以帮忙。它将隐藏工作暂存区更改。让你的工作区看起来是干净的。
  2. 注意:只有添加到版本管理的文件才能使用stash,比如你新增的文件,必须先git add file_name 到版本控制后stash才能识别它。
  3. git stash save "这是说明信息" //添加stash
  4. git stash list //查看stash列表
  5. git stash pop //恢复存储的最后一个stash工作场景场,并删除stash条目
  6. git stash apply stash@{num} //恢复到指定的工作场景,num为git stash list看到的内容,此操作不会删除stash内容,需要手动删除
  7. 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. 1. git stash //隐藏当前工作现场,比如我们要将未开发完成的项目放一放,去处理一些bug,这里以dev分支为例
  2. git checkout dev
  3. git stash save "这里是一些说明信息"
  4. git status //如果stash创建成功,可以看到工作区是干净的
  5. git checkout -b dev_bug //此时创建bug分区并切换到分支进行工作即可
  6. 2.git add & git commit //将修改内容提交即可
  7. git add .
  8. git commit -m "我要去修bug,稍后回来"
  9. git checkout -b dev_bug //此时创建bug分区并切换到分支进行工作即可

4. 解决冲突

  1. 常见场景场:
  2. 1.使用git pull来更新远端代码时
  3. 2.分支merge时代码冲突
  4. 3.git fetch & git merge
  5. 冲突的场景可以有很多,但是解决冲突的办法都一样:
  6. 1. git status //查看工作区状态
  7. 2. 手动解决冲突的文件
  8. 3. git add . //将解决的文件添加到暂存区
  9. 4. git commit -m "说明" //提交已解决的文件,告诉git冲突以及处理
  10. 5.git push //将最新代码同步到远端
 
 

git忽略文件

忽略文件分两种情况:
一.文件未入库(未添加到版本控制)
在仓库目录下新建一个名为”.gitignore”的文件(以.开头为隐藏文件,如果你看不到文件,请更改设置来显示隐藏文件),”.gitignore”文件对其所在的目录及所在目录的全部子目录均有效。通过将.gitignore文件添加到仓库,其他开发者更新该文件到本地仓库,以共享同一套忽略规则,在项目初期,我们会添加.gitignore来排除一些需要永久排除的文件或者目录。下面是”.gitignore”文件配置语法:

  1. #以'#'开始的行,被视为注释.
  2. #忽略掉所有文件名是 foo.txt的文件.
  3. foo.txt
  4. #忽略所有生成的 html文件
  5. *.html
  6. #foo.html是手工维护的,所以例外.
  7. !foo.html
  8. #忽略所有.o和 .a文件.
  9. *.[oa]
  10. #仅忽略当前目录下的config.php,其他目录下的config.php不会被忽略
  11. /config.php
  12. #忽略build文件夹下的所有文件,但不包括build文件夹本身
  13. build/
  14. #忽略 doc/haha.txt, 不包括 doc/server/haha.txt
  15. doc/*.txt
  16. #忽略 doc/下所有的 .pdf 文件
  17. doc/**/*.pdf
  18. 代表任意多层上级目录,此条目将忽略所有目录结构包含"/bin/Debug"Debug目录下的所有内容
  19. **/bin/Debug/

二. 文件已入库(已在版本库中)
有时候我们要临时忽略已存在于本版库中的指定文件提交请求信息,我们可以使用:
$ git update-index --assume-unchanged file_path
重新添加到版本管理中
$ git update-index --no-assume-unchanged file_path
注意:这种方法只会忽略你本地仓库对特定文件的提交信息,并不会影响到其他开发人员对文件的操作(此文件在他们本地仓库,可修改,可提交,可push到远端)

 

创建合并请求

1.登录gitlab(略)

2.创建合并请求

3.选择分支




4.填写信息并提交

posted @ 2020-07-07 11:06  jk波  阅读(23)  评论(0)    收藏  举报