关于Git命令行的不正经使用记录

昨天和今天对于Git的使用突然就有了很多感悟....之前仅仅只是看过各种blog的介绍和部分官方文档,以为自己对Git的各种命令都有一定的了解了,但等我实际上手之后才发现没有实践空谈理论是完!全!没!用!的!不管之前记了多少笔记,等发生问题以后还是不知道该怎么办。

这次使用git的起因是要在gitlab上完成一个issue,要求:

  • 新建一个符合要求的分支
  • 在分支上进行修改之后按照标准提交commit
  • push到远程之后新建merge请求
  • 管理员审核通过之后合并并删除分支

流程看起来挺容易的,但我是一个之前从来没有在gitlab上面提交代码的小白.....并且因为学生认证没有下来用不了Git GUI软件,只能用终端操作。嗨,虽然十分辛酸,但是在我下午和晚上的努力下终于弄好了。(终于明白了为什么说用终端操作的都是大佬)本来简单的流程因为各种突发问题而变得有些复杂(挠头),在这里记录一下。

背景条件:已经clone了项目仓库并有了本地分支

我的流程是这样的:

  • 在gitlab上找到分配给自己的issue,创建分支或者创建分支和合并请求
    (两者的区别并不大,如果选择创建合并请求,在没有修改好代码或者还没有正确提交时可以先close merge request,处理好之后再reopen。但是要注意创建的分支都是远程分支,没有创建本地分支)

  • 打开终端cd到项目文件中

  • git branch -a查看当前分支情况,没有看见新建的远程分支,使用git fetch重新拉取分支信息。拉取之后重新查看分支情况,新建的分支出现

  • git branch --set-upstream-to=origin/#23 hxh2 令本地分支与远程分支取得联系。#23是issue新建的远程分支名,hxh2是本地分支名称。(因为本地和远程的分支名不一样我经历了许多磨难,猛男落泪)

  • git add .将修改的文件保存到暂存区
    git commit将暂存区的文件提交到本地仓库
    上面这两个很普通,但是在团队协作时提交时要注意遵循commit规范,不同的修改要标明不同的type,我开始就是因为commit不规范被打回来了

  • git push 将本地的提交推送到远程。
    如果本地分支名称和远程分支名称相同的话,现在push成功之后就能在新建的远程分支#23上的看见最新的commit信息,然后提交#23分支与目标分支的merge请求就可以了。故事结束。但是因为我的名称不相同,所以控制台提示我......

fatal: The upstream branch of your current branch does not match
the name of your current branch.  To push to the upstream branch
on the remote, use

    git push origin HEAD:#23

To push to the branch of the same name on the remote, use

    git push origin HEAD

To choose either option permanently, see push.default in 'git help config'.

因为名称不一样,git建议我使用git push origin HEAD:#23命令来push到关联的远程分支。我想着改就改呗,就按照指令输入,但是还是没能push上去,出现了新的问题:

To gitlab.com:pockeinterconnect/pocketinterconnect.git
 ! [rejected]        HEAD -> #23 (non-fast-forward)
error: failed to push some refs to '[email protected]:pockeinterconnect/pocketinterconnect.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and integrate the remote changes
hint: (e.g. 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

嗯???还是失败,并且显示现在关联的远程分支又有改变了,我的commit在后面,要重新拉取远程分支才能推送。我想着好吧,虽然这个项目总共就两个人现在肯定只有我一个人在操作不知道为什么远程分支改变了,但还是pull吧。然后google了一下,大家说这种情况应该执行git pull --rebase将未同步的同步一下(现在想来应该就是这里出了问题)。
执行git pull --rebase,控制台又说我有没有暂存的文件

error: cannot pull with rebase: You have unstaged changes.
error: please commit or stash them.

嗯???在上次commit到本地之后我没有进行任何修改啊?为什么会有unstaged 文件?算了有也先stash吧,看看之后会发生什么(这什么小白鼠心态啊)
于是git stash , 再git pull --rebase:

First, rewinding head to replay your work on top of it...
Applying: style(注释): 修改ClassPoint和分界线等部分注释
Using index info to reconstruct a base tree...
M   PocketCampus.xcworkspace/xcuserdata/huangxiaohui.xcuserdatad/UserInterfaceState.xcuserstate
Falling back to patching base and 3-way merge...
warning: Cannot merge binary files: PocketCampus.xcworkspace/xcuserdata/huangxiaohui.xcuserdatad/UserInterfaceState.xcuserstate (HEAD vs. style(注释): 修改ClassPoint和分界线等部分注释)
Auto-merging PocketCampus.xcworkspace/xcuserdata/huangxiaohui.xcuserdatad/UserInterfaceState.xcuserstate
CONFLICT (content): Merge conflict in PocketCampus.xcworkspace/xcuserdata/huangxiaohui.xcuserdatad/UserInterfaceState.xcuserstate
error: Failed to merge in the changes.
Patch failed at 0001 style(注释): 修改ClassPoint和分界线等部分注释
hint: Use 'git am --show-current-patch' to see the failed patch
Resolve all conflicts manually, mark them as resolved with
"git add/rm ", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".

哇突然出现了这么多问题太惊喜了。看一下控制台输出,显示与#23 merge失败,因为某个文件发生了冲突。只有解决冲突之后才能继续。

有意思,按照道理来说找到冲突文件 -> 修改文件就行了。但是!这喵的文件的我没改过啊!UserInterfaceState.xcuserstate在哪里我都不知道!!这还怎么办啊!

在当前的情况下,不能进行push操作,也不能继续merge。将stash pop出来之后,强行运行git push origin #23推送到远程分支时控制台会提示现在不处于任何分支上,而是在rebase的进程中,要先完成merge进程才可以继续操作。

使用git status查看当前文件的状态:

rebase in progress; onto 0ece80b
You are currently rebasing branch 'hxh2' on '0ece80b'.
  (fix conflicts and then run "git rebase --continue")
  (use "git rebase --skip" to skip this patch)
  (use "git rebase --abort" to check out the original branch)

Changes to be committed:
  (use "git reset HEAD ..." to unstage)

    modified:   PocketCampus/State/DataResponseModel/ClassTableResponseCourseInfoModel.swift
    modified:   PocketCampus/State/DataResponseModel/WeeksNumber.swift
    modified:   PocketCampus/View/ContentView/ClassTable/ClassTableContentView/ClassCellSeparationView.swift
    modified:   PocketCampus/View/ContentView/ClassTable/ClassTableContentView/ClassCellSizeViewConfigure.swift
    modified:   PocketCampus/View/ContentView/ClassTable/ClassTableContentView/ClassTimeCellView.swift
    modified:   PocketCampus/View/ContentView/ClassTable/ClassTableContentView/ClassTimeSeparationView.swift
    modified:   PocketCampus/View/ContentView/ClassTable/ClassTableContentView/ClassWeekDayDisplayView.swift
    modified:   PocketCampus/View/ContentView/ClassTable/ClassTableContentView/ClassWeekDayDisplayViewModel.swift

Unmerged paths:
  (use "git reset HEAD ..." to unstage)
  (use "git add ..." to mark resolution)

    both modified:   PocketCampus.xcworkspace/xcuserdata/huangxiaohui.xcuserdatad/UserInterfaceState.xcuserstate

很明显地显示问题就出在both modified的文件中。Google这个文件,在stackoverflow里面找到了答案:这个文件不是项目中的代码文件,而是xcode用来储存GUI状态的。仅仅是改变Xcode窗口的大小都有可能会被标记为文件的修改。


StackOverFlow

解决方法:git rm --cached *xcuserstate 删除储存GUI状态的文件。add并commit当前的修改(vi编辑器可能会出现错误,要确保最后的commit是成功的)

如果commit不成功时,用git status 查看文件的状态,会发现控制台提示你使用commit结束merge:

On branch hxh2
Your branch and 'origin/#23' have diverged,
and have 2 and 2 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)

成功commit之后working tree clean,同时merge进程结束。现在就可以push了,但是我不敢用git push origin HEAD:#23这种命令......于是试了别的方法:git push origin hxh2:#23 前面一个是本地分支,后面一个是远程分支。

push成功,接下来终于可以在gitlab上面发送合并请求了......后面的就很轻松了,这里略过不提。

过程其实挺简单的,但是因为对git命令不熟练,中间走了很多弯路。在发现文件存在conflicts的时候没有第一时间处理,而是执行了其他命令让过程变得复杂......这次给我的教训就是一定要认真看git输出的错误信息,对于各种blog的信息要善于分辨,此外,不懂得地方要及时解决。实在解决不了了就删掉分支重新弄吧(和善的微笑)

接下来的任务是学会使用GUI 操作git......在我开始写文章的时候学生认证还没有下来,快写完的时候已经下来了(挠头)希望学习GUI的过程能够顺利吧。

你可能感兴趣的:(关于Git命令行的不正经使用记录)