V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ericgui
V2EX  ›  PHP

下次想改文件名或者删除文件,务必不要在 IDE 里面直接改,而要在 shell 里使用 git mv 或 git rm

  •  
  •   ericgui · 2017-01-05 19:04:33 +08:00 · 4478 次点击
    这是一个创建于 2880 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这几天被一个巨傻逼的问题折磨死了。

    我在 IDE 里面,把一个文件名字改为驼峰形式,感觉看起来漂亮点。
    然后尼玛我就发现 push 到 github 之后,竟然有两个文件。
    比如 github repo 和本地都有一个文件 abc ,版本号是相同的
    然后我在本地把 abc ,改为 Abc ,
    然后本地只有 Abc ,但 push 之后, github repo 里,会有 abc 和 Abc 同时存在!
    而且我每次修改更新本地的 Abc , push 之后, github repo 里 abc 有更新, Abc 没更新!
    你要说既然 github 上有 2 个文件,那我就 pull 一下, 看能不能把两个文件都拉下来,然后删一个不就行了?
    pull 不下来!

    后来只好在vps里新建一个文件夹,git init,git pull之后,用“git rm abc”删了这个老文件,然后commit,再push到github上,这时github上的abc才算删除了。

    然后,如果不删除本地repo,直接git pull,会把本地Abc给删了。我感觉日了狗了,只好把本地repo删干净,重新在本地新建一个文件夹,再git init,git pull,这才搞好。

    这个问题让我搞得觉得自己智商都下降了。

    有谁有啥经验的,帮忙指点一下这为啥出现这么奇葩的问题么?
    第 1 条附言  ·  2017-01-05 22:36:09 +08:00
    谢谢各位的解释。

    今天搜到这个帖子,似乎完满解释了我的疑惑:

    http://stackoverflow.com/questions/572549/difference-between-git-add-a-and-git-add

    总之,以后用"git add -A",就可以避免这个问题了。

    当然, ignorecase=false 设置也是有必要的。
    26 条回复    2017-01-08 14:45:55 +08:00
    vibbow
        1
    vibbow  
       2017-01-05 19:11:35 +08:00
    目测你用的 Linux/Mac
    kilnyy
        2
    kilnyy  
       2017-01-05 19:12:53 +08:00
    看起来像 git add 时候 add 没 add 删除的部分吧?
    ericgui
        3
    ericgui  
    OP
       2017-01-05 19:12:59 +08:00
    @vibbow Windows
    ericgui
        4
    ericgui  
    OP
       2017-01-05 19:14:06 +08:00
    @kilnyy 我每次 git add 的时候,
    都是直接省事,很懒,直接用“ git add .”
    会不会是这个问题?
    sinalvee
        5
    sinalvee  
       2017-01-05 19:14:26 +08:00
    感觉你用的是 windows
    如果是的话,应该跟 windows 路径大小写不敏感有关
    coolair
        6
    coolair  
       2017-01-05 19:24:25 +08:00 via Android
    开启 git 大小写敏感设置即可。
    JasonSi
        7
    JasonSi  
       2017-01-05 19:43:41 +08:00
    我大致看了一下,我认为是这样的:你改了名字,实际上是相当于你删除了 A 文件,又新建了 B 文件,于是你又 git add .,这导致 git 没有追踪到你 A 文件的删除事件,只认为你新建了 B ,然后 commit push 了,然而此时的远端是认为你有 AB 文件,而本地是只有 B 文件的,所以历史冲突,不能直接 pull 。
    解决办法就是 git rm A 或者 git mv A ,其实更方便的方法是换个 IDE 吧。。
    因为我之前也遇到这种问题,后来用 Atom 的时候发现直接在 Atom 里删除,重命名他都会帮我在 git 中留下记录。
    当然了 Atom 只是个编辑器不算 IDE 。。
    hxsf
        8
    hxsf  
       2017-01-05 20:02:36 +08:00
    很明显 lz 用的 windows , windows 不区分大小写。所以会出现这个问题。
    AlisaDestiny
        9
    AlisaDestiny  
       2017-01-05 22:06:40 +08:00
    我的 IDEA 没有出现这种情况啊。
    我把 A.java 文件 rename 成 B.java 。然后 git status 显示 delete A.java 和 add B.java 。
    jaysun
        10
    jaysun  
       2017-01-05 22:09:45 +08:00 via Android
    ignorecase=false
    ericgui
        11
    ericgui  
    OP
       2017-01-06 01:11:15 +08:00
    @JasonSi 对,就是这么回事。用 git add . 仅仅记录了增加或修改的文件,要用 git add -A

    git add -A = git add . + git add -u

    http://stackoverflow.com/questions/572549/difference-between-git-add-a-and-git-add
    这帖子写的很清楚

    还是我对 git 不熟啊
    不过,这好好折腾一番,也算熟了,哈哈
    ericgui
        12
    ericgui  
    OP
       2017-01-06 01:12:15 +08:00
    @AlisaDestiny 我用 Hbuiler ,这破 IDE 唯一的好处是写 javascript , html 和 css 的时候比较省事,其他目前没看到什么优势
    ericgui
        13
    ericgui  
    OP
       2017-01-06 01:14:39 +08:00
    @JasonSi 我用 Hbuiler ,这破 IDE 唯一的好处是写 javascript , html 和 css 的时候比较省事,其他目前没看到什么优势
    msg7086
        14
    msg7086  
       2017-01-06 03:00:24 +08:00
    我的经验是,如果一个人用不好 Git 的基本功能,我会塞给他一个好用的 GUI 。
    canfoderiskii
        15
    canfoderiskii  
       2017-01-06 07:44:32 +08:00 via Android
    直接用 GUI 压根不会遇到这种问题
    miaotaizi
        16
    miaotaizi  
       2017-01-06 09:20:56 +08:00 via iPhone
    @ericgui 我大 phpstom 面前其他的 php IDE 都是渣渣
    chuanqirenwu
        17
    chuanqirenwu  
       2017-01-06 10:20:58 +08:00 via iPhone
    我的建议是,换个 ide ,我在 pycharm 下执行你描述的操作没有出现任何问题。
    Explorare
        18
    Explorare  
       2017-01-06 15:13:51 +08:00
    @ericgui 实际上 Git v.2.x 中 `git add .`会跟踪删除记录,如下所示:

    ```
    { New folder } » git init /cygdrive/c/Users/Explorare/Desktop/New folder
    Initialized empty Git repository in /cygdrive/c/Users/Explorare/Desktop/New folder/.git/
    { New folder } HEAD » echo Change me > change-me
    { New folder } HEAD » echo Delete me > delete-me
    { New folder } HEAD » git add change-me delete-me
    { New folder } HEAD » git status /cygdrive/c/Users/Explorare/Desktop/New folder
    On branch master

    Initial commit

    Changes to be committed:
    (use "git rm --cached <file>..." to unstage)

    new file: change-me
    new file: delete-me

    { New folder } HEAD » git commit -m initial
    [master (root-commit) 4b1ff0d] initial
    2 files changed, 2 insertions(+)
    create mode 100644 change-me
    create mode 100644 delete-me
    { New folder } master » echo OK >> change-me
    { New folder } master » rm delete-me /cygdrive/c/Users/Explorare/Desktop/New folder
    { New folder } master » echo Add me > add-me
    { New folder } master » git status /cygdrive/c/Users/Explorare/Desktop/New folder
    On branch master
    Changes not staged for commit:
    (use "git add/rm <file>..." to update what will be committed)
    (use "git checkout -- <file>..." to discard changes in working directory)

    modified: change-me
    deleted: delete-me

    Untracked files:
    (use "git add <file>..." to include in what will be committed)

    add-me

    no changes added to commit (use "git add" and/or "git commit -a")
    { New folder } master » git add . /cygdrive/c/Users/Explorare/Desktop/New folder
    { New folder } master » git status /cygdrive/c/Users/Explorare/Desktop/New folder
    On branch master
    Changes to be committed:
    (use "git reset HEAD <file>..." to unstage)

    new file: add-me
    modified: change-me
    deleted: delete-me

    { New folder } master » git --version /cygdrive/c/Users/Explorare/Desktop/New folder
    git version 2.8.3
    ```
    ericgui
        19
    ericgui  
    OP
       2017-01-07 12:34:32 +08:00
    @Explorare 我用 1.9.2 。。。。。。。明白了,下次我直接升级 git 2.X 版本吧,谢谢
    ericgui
        20
    ericgui  
    OP
       2017-01-07 12:35:55 +08:00
    @msg7086
    @canfoderiskii GUI 还是拉倒吧,我发现我对命令行更敏感。别提了。我曾经下载过 GUI 版本的,根本看不懂。
    msg7086
        21
    msg7086  
       2017-01-07 15:48:18 +08:00
    @ericgui 我是说「好用的 GUI 」,不是「看不懂的 GUI 」。
    ericgui
        22
    ericgui  
    OP
       2017-01-07 16:13:59 +08:00
    @msg7086 哦。能推荐一个么?我上次真的没看懂。也忘了上次下的 GUI git 是啥名字了。谢谢
    msg7086
        23
    msg7086  
       2017-01-07 17:06:09 +08:00
    @ericgui 可以试一下 SmartGit 。
    不一定适合所有人,不过我们团队里大家用了感觉都不错, Git 操作比命令行时候精细了许多。
    拿来做复杂的分支 Merge/Rebase 功能也非常舒服,不再像命令行下那样 Rebase 一时爽,○○×××了。
    canfoderiskii
        24
    canfoderiskii  
       2017-01-07 22:37:48 +08:00 via Android
    @ericgui windows 下 tortoisegit 挺好用。 smartgit 也不错,还跨平台
    thecon
        25
    thecon  
       2017-01-08 11:14:19 +08:00
    不关 IDE 的事吧, windows 的锅
    ericgui
        26
    ericgui  
    OP
       2017-01-08 14:45:55 +08:00
    @msg7086
    @canfoderiskii 谢谢,既然都推荐 smartgit ,那我试试吧。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6012 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 03:06 · PVG 11:06 · LAX 19:06 · JFK 22:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.