V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
Kcelone
V2EX  ›  git

git 技能复习进阶(开局一个键盘,内容全靠抄)

  •  
  •   Kcelone · 2019-10-26 10:39:16 +08:00 · 5737 次点击
    这是一个创建于 1890 天前的主题,其中的信息可能已经有所发展或是发生改变。

    贴个车 http://web.mit.edu/~mkgray/project/silk/root/afs/sipb/project/git/git-doc/

    常用操作:

    git add . 或某个文件,某些文件
    git commit -m 'fix ' 提交信息
    git status 查看当前版本库状态
    git diff 文件 1 文件 2   对文件进行比较(也可在版本之间进行比较,后面文件均替换为版本号) 
    git push 推送
    git pull 拉取
    git merge 合并指定分支到当前分支
    git checkout +文件,表示  撤销对某文件的修改; + 分支,表示切换分支
    git rm 文件  删除某文件
    git clone 克隆
    git checkout -b +分支,表示创建新分支(非 master 分支)
    git branch 查看当前分支; + -a 表示查看所有分支 
    git branch -d +分支 删除某分支
    

    日志:

    日志查询:

    git log:

    		查看某分支当前的版本号
    

    操作日志查询:

    		可以查看某分支自己之前执行过什么操作。
    

    git reflog:

    工作区及暂存区

    	工作区就是存有.git 文件夹的父文件夹,暂存区是在.git 文件夹里的区域。
    我们执行的 git add [.]就是把文件从工作区添加到了暂存区(stage)中,而 git commit 就是			把暂存区里的东西提交到当前的本地分支比如 test 分支,工作区就变干净了。
    

    远程仓库

    添加远程仓库 git remote add origin + 远程 git 地址 (例如 [email protected]:1900/reviewgit.git),
    

    分支管理

    创建一个分支就是创建一个指针,该指针指向 master 的某个节点,另外会有 head 指针来负责分支切换。具体指令在文章起始部分。
    

    冲突解决

    黄金准则是:有冲突解决冲突,而不要直接就回滚,因为代码库不是你一个人在用!
    
    操作就是,打开冲突文件,搜索 >>>>>标识确定冲突部分,删除不想要的内容,删除>>>>  及 ====,然后 git add 文件,提交。
    

    bug 分支

    并发的处理了两个问题,问题 1 需要尽快提交解决线上问题,问题 2 还没搞定,这个时候可以利用 stash 功能来暂存。git stash,接着解决问题 1,在当前分支创建一个临时分支,然后修改问题,并提交。
    

    暂时先这么多吧,待续。

    25 条回复    2019-10-28 16:30:00 +08:00
    shawndev
        1
    shawndev  
       2019-10-26 11:38:30 +08:00
    git stash, git rebase, git cherry-pick, git reset, git revert, git reflog...
    wysnylc
        2
    wysnylc  
       2019-10-26 11:56:25 +08:00
    测试分支未完成代码被错误合并到 A 分支,然后 A 分支进行了代码开发 3 个版本后,将 A 分支合并到主干并更新.此时 A 分支有测试分支的未完成代码和本身 A 分支正常开发的代码,主干合并了 A 分支同样被测试分支代码污染
    请问如何解决?
    chuxiaonan
        3
    chuxiaonan  
       2019-10-26 12:02:49 +08:00
    @wysnylc 老哥 git rebase 了解一下
    当然 如果远端都被污染了 肯定是少不了 git push --force 的
    iMusic
        4
    iMusic  
       2019-10-26 12:10:14 +08:00
    这是基础,不是进阶吧。
    orzorzorzorz
        5
    orzorzorzorz  
       2019-10-26 12:46:27 +08:00
    @wysnylc #2 如果不急,那就主分支合并到测试分支,写完了同步三个分支;急的话,revert A 合并进主分支的那次提交,checkout 一个新分支继续改,改完同步下三个分支
    HannibaI
        6
    HannibaI  
       2019-10-26 13:38:43 +08:00
    应该多写写日常工作流。这些东西我 man git 看一下就有了
    phpfpm
        7
    phpfpm  
       2019-10-26 14:22:27 +08:00
    @wysnylc 直接在主分支上 git revert 生成一个提交求 mr
    wysnylc
        8
    wysnylc  
       2019-10-26 14:23:02 +08:00
    @chuxiaonan #3 最终的做法是 reset 同时将主干和 A 分支回滚,然后重新将 A 分支的代码 commit 然后 force A 分支和主干
    我的本意是想考考贴主,天天记死命令能不能解决这个问题
    这种基础知识都不知道有多少博客了还拿出来炒冷饭一点干货没有
    marco25
        9
    marco25  
       2019-10-26 14:28:33 +08:00
    自从用了 magit,git help 都不需要查了
    xuboying
        10
    xuboying  
       2019-10-26 14:51:10 +08:00
    没有 git fetch。。。看来是不太在乎队友在干嘛的老司机了
    wysnylc
        11
    wysnylc  
       2019-10-26 14:53:33 +08:00
    @phpfpm #7 不行,revert 的版本都是以后要合并到主干的,revert 会导致无法合并这部分代码
    chuxiaonan
        12
    chuxiaonan  
       2019-10-26 14:53:47 +08:00
    @wysnylc 哈哈 这样呀
    sdushn
        13
    sdushn  
       2019-10-26 16:32:17 +08:00
    @wysnylc 来学习啦,如果把 A 分支的错误提交回滚,解决冲突后合并到主干呢,能否解决问题
    wysnylc
        14
    wysnylc  
       2019-10-26 16:40:18 +08:00
    @sdushn #13 那要看你怎么"解决"A 分支的错误,如果你只是想删除被污染的代码然后合并主干的话不行,因为这部分代码在未来是有用的,那么为了解决你的这个删除带来的问题需要将被删除的代码重新提交.而且只在 A 分支其实怎么动都无济于事,始终是需要在主干上 force 的,你细细的品
    iyeatse
        15
    iyeatse  
       2019-10-26 20:19:11 +08:00
    不试试 zsh 吗
    gaa,gc,gst,gp,gup,grb
    Pastsong
        16
    Pastsong  
       2019-10-26 20:28:31 +08:00
    @iyeatse 这是 alias 是功能
    weixiangzhe
        17
    weixiangzhe  
       2019-10-26 21:18:59 +08:00 via Android
    github。上有个飞行手册啥的 覆盖面很广 很好用
    secondwtq
        18
    secondwtq  
       2019-10-27 00:24:04 +08:00
    @marco25 老哥有没有在大项目用过 magit,我感觉巨卡无比 ... 就没再用了


    @wysnylc 有些时候是禁止 force push 的 ...
    Allianzcortex
        19
    Allianzcortex  
       2019-10-27 02:17:48 +08:00 via iPhone
    @secondwtq 禁止 force push 的话在我本底分支 squash & rebase 了几个我的小 commit 合并为一个,怎么同步到远程上?
    Allianzcortex
        20
    Allianzcortex  
       2019-10-27 02:24:04 +08:00 via iPhone
    @secondwtq 搜了下也就是这种情况: https://stackoverflow.com/questions/1302769/keeping-remote-repository-in-sync-through-a-rebase,我的解决方法也是和回答里说的,You need --force because origin/topic will change the ancestor and you have disable fast forward check. 不允许在单独的 branch force push 的话这种情形似乎无法做?...
    secondwtq
        21
    secondwtq  
       2019-10-27 03:25:05 +08:00
    @Allianzcortex 就是不能做。实际上有些项目是鼓励控制 commit size 的
    nznd
        22
    nznd  
       2019-10-28 10:25:56 +08:00
    自己一个人仓库 push 不上去 就 fuxk 一下(
    当然这不是好习惯 但是设备多起来 git 控制版本有点繁琐,remote 桌面一个复制就过去了
    要是用 git 一定要 pull merge commit push 然后再去另一边 pull 我好难啊(
    wysnylc
        23
    wysnylc  
       2019-10-28 12:34:44 +08:00
    @secondwtq #18 所以要去除项目保护才行,本身出现这种问题就需要重视
    coco65535Plus
        24
    coco65535Plus  
       2019-10-28 16:28:14 +08:00
    git commit --amend -m "new xxxx"

    git merge --no-ff [develop]
    coco65535Plus
        25
    coco65535Plus  
       2019-10-28 16:30:00 +08:00
    git remote set-url origin [new remote repository url] 项目迁移地址时使用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2798 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 02:54 · PVG 10:54 · LAX 18:54 · JFK 21:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.