Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Git #6

Open
374632897 opened this issue Nov 8, 2016 · 3 comments
Open

Git #6

374632897 opened this issue Nov 8, 2016 · 3 comments
Labels

Comments

@374632897
Copy link
Owner

374632897 commented Nov 8, 2016

一些常用命令

  • git commit -am "message": 用于添加并提交。
  • git reset --hard <commit> : 将当前分支恢复到指定的commit
  • git diff <branchname> --shortstat: 显示分支和远程分支的diff信息, 具体如下所示:
    git diff origin/dev --shortstat
  • git diff <branchname> --name-only : 该命令将会显示当前分支与指定分支相比发生变化的文件
    194 files changed, 1602 insertions(+), 46151 deletions(-)
  • git reset: 撤销刚才使用git add添加的文件
    • git reset --hard: 使用这个参数将会彻底回退到某个历史版本
    • git reset --soft : 使用这个参数将会回退到某个版本, 但是只会回退commit的信息, 如果要继续提交, 直接commit即可。 当某次提交之后, 发现有些文件是需要另外处理的, 那么就可以回退到之前的版本, 处理后再重新commit。

一些小技巧

  • 恢复误删除分支

    • 使用git log -g获取到已删除分支的最后一次的commit的哈希值
    • 使用git branch <branchname> <commit>来从该commit出新建一个分支。
  • 合并分支的时候, 将一个分支的所有提交合并为另一个分支的一个提交

    • git merge <branchname> --squash

关于.gitignore

  • 忽略文件的最后不能跟分号

    content/images/; # 这种情况下, 将不能够正确识别, 应该改为下面这种
    content/images/
  • 文件被跟踪后再修改.gitignore添加该文件以便不被记录
    有时候可能会遇到这样的情况, 使用git add .然后将不需要添加的文件添加了, 之后才发现这个文件不应该被添加, 然后去修改.gitignore文件, 结果之后对这个文件的更改依然会被记录进去。 然后出现的现象就是, .gitignore并没有什么用。 事实上, gitignore只会在检测到目录中有未跟踪文件(untracked files)的时候, 才会根据.gitignore里面的通配符去匹配文件, 如果文件匹配, 将会忽略, 否则在使用git add的时候, 就会将其添加进去, 从而变成跟踪文件, 也就是说, 在git add一个文件之后, 那么只要这个文件发生了变化, 无论是更改还是删除, git都将会跟踪其变化, 所以这就造成了“add之后修改ignore, 但是并没有ignore”的现象了。
    那么解决方案也是有的。 只需要取消对文件的跟踪就行了。

    git rm --cached <filename>

    如果是某个文件夹下的东西都不该被提交, 但是却被提交了, 那么可以添加 -r选项来清除对该文件夹的跟踪。

    git rm --cached -r <foldername>

    那么如果文件很多怎么办?比如有一大堆*.class文件, 这个时候就直接find就可以咯。

    find . -iname "*.class" -exec bash -c "git rm --cached {}" {}\;

    然后再执行git add .将这一次的更改添加进去, 之后再出现*.class的时候就会被忽略掉了(前提是你在ignore里面添加了对应的匹配规则)

@374632897 374632897 changed the title 关于gitignore Git Nov 11, 2016
@374632897 374632897 added the Git label Nov 15, 2016
@374632897
Copy link
Owner Author

更改上一次的commit message

如果发现上一次的commit message里面有拼写错误或者其他错误, 需要更新提交信息的话, 可以使用git commit --amend -m "${message}"来更新最新一次的提交信息。 git commit --amend 会用一个新的 commit 更新并替换最近的 commit, 参见

@374632897
Copy link
Owner Author

374632897 commented Aug 25, 2017

revert 还是 reset ?

写代码写久了, 难免会出现一些意外。 当一不小心把一个不应该提交的东西提交到了Git仓库里的时候, 你可以使用 revert或者reset来撤销之前的提交。 那么什么是 revert, 什么是 reset , 又该如何选择一个合适的回退方式呢?

revert

在当前工作目录干净的情况下(git status不会看到未跟踪或者未提交的文件), 可以使用 revert 来撤销一个或者多个 commit , 并且会将这次撤销作为一个新的 commit 进行提交。

当撤销的commit 是一个 merge 的 commit 的时候,需要通过-m 选项来指定具体的 commit。

参考:

@374632897
Copy link
Owner Author

374632897 commented Nov 25, 2017

Git Tips

  • 获取当前仓库下未提交或者未 track 的文件列表(过滤已删除文件)

    • git status -su | sed $'s,\x1b\[[0-9;]*m,,g' | awk '{if ($1 != "D") { print $2}}'
    • 对于需要对这些文件进行更改的操作会非常方便, 比如 eslint 或者 eslint --fix, 然而对于后者, 通常推荐做法是在你提交一个 commit 之后再进行相应操作, 这样你能够更好的看出你的那些代码被修改了, 有没有出错
  • 拷贝当前 HEAD 的 hash 值

    • git rev-parse HEAD | clipcopy
    • 有时候我们进行部署的时候不是根据分支来部署而是根据 commit 来部署,这个时候就需要拷贝当前 HEAD 的 commit, 次数多了也麻烦。 把它作为一个 alias 的话, 使用起来会更加方便。
  • 删除已 merge 的本地和远程分支

    • git checkout master
        git branch --merged | \
        sed $'s,\x1b\\[[0-9;]*m,,g' | \ # 移除 ANSI 字符 eg: \x1b[1;31m -> ''
        egrep -v "master|release|test" | \
        xargs -I{} bash -c "git push -d origin {} && git branch -D {}"
    • 避免无用分支过多造成的眼花缭乱。
  • 根据关键词快速前往分支

    •  to () {
          local branches=`git branch | \
             sed $'s,\x1b\\[[0-9;]*m,,g' | \
             grep -i "$1" --color=never`;
          local count=`echo "$branches" | wc -l`;
          if [[ "$count" -gt 1 ]]; then
            echo
            echo -e "\x1b[1;31m[WARNING]:Too much matched, please choose one of them:\x1b[0m\n";
            echo "$branches"
          else
           # trim whitespace
            git checkout `echo $branches`;
          fi
       }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant