Git - Tips

01 - 05

01 - 临时保存和恢复当前改动

执行git stash保存后,git status将显示无任何改动。

git stash  # Temporarily stores all modified tracked files

git stash list  # Lists all stashed changesets
git stash pop <stash> # Restores the stashed files, and delete the stashed files.
git stash apply <stash> # Restores the stashed files, and reserve the stashed files.

git stash drop  # Discards the most recently stashed changeset
git stash show  # Show the latest changes recorded in the stash as a diff between the stashed state and its original parent. 
git stash clear  # Remove all the stashed states. 

02 - 推送失败

不同的人修改同个文件的同一个地方,然后推送到远程库是会发生“推送失败”,因为推送有冲突。
解决方法:先用git pull抓取最新的提交,然后在本地合并,解决冲突,再推送。
使用git pull前,必须指定本地branch分支与远程origin/branch分支的链接(git branch --set-upstream-to

03 - 多人协作

尝试用git push origin <branch name>推送修改。
如果推送失败,可能因为远程分支比本地更新早,使用git pull试图合并。
如果合并有冲突,则需要解决冲突,并在本地提交,再用git push origin <branch name>推送。

04 - 配置local repository

Local配置优先级高于global配置,而且Local的配置必须在local repository目录下完成。
示例:

$ git config --local user.name "anliven"  # 配置local repository的用户名
$ git config --local user.email "anliven@yeah.net"    # 配置local repository的邮箱

$ git config --local --list # 显示local repository配置信息
$ git config --local --unset [value-regex]  # 去除local repository配置

$ git config --local --edit  # 交互式local repository配置

05 - 配置文件

Git配置文件优先级:local > global > system

配置文件 有效范围 查看 配置方法 名称及目录
local 本地仓库 git config --local --list git config --local --edit 本地仓库目录下,例如:<local repository>\.git\config
global 所有仓库 git config --global --list git config --global --edit 用户目录下,例如:C:\Users\xxx.gitconfig
system 不建议改动 git config --system --list git config --system --edit git的安装目录下,例如:C:\Program Files\Git\mingw64\etc\gitconfig

06 - 10

06 - 合并多个commit

为了避免太多的 commit 而造成版本控制的混乱,通常推荐将这些 commit 合并成一个提交。
执行"git rebase -i"命令进入到vi编辑模式, 将显示最近未提交的commit和指令说明信息。
-i 参数表示互动 interactive,这时 git 会使用设定的编辑器,可以对 git 历史记录做详细修改。

例如:

pick da40ffc 111
pick ca4d1cd 222
pick 9cb7b99 333

# Rebase 2b8a602..9cb7b99 onto 2b8a602 (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#

上方未注释的部分:要执行的指令(由命令名称、commit hash 和 commit message 组成)
下方注释的部分:指令说明
其中

  • pick : 表示该行的commit 被选中,需要进行 rebase 操作
  • squash : 将这一行的 commit 与上一个 commit 进行合并
  • fixup : 与 squash 相同,但不会保留这行 commit 的提交 message 信息

一般情况下,是将指定的 commit 前方的命令改成 squash 或 s,然后输入:wq 保存并退出。
然后进入到 commit message 的编辑界面,其中非注释部分涉及的 commit message, 如果有需要可以修改成新的 commit message, 然后输入wq保存并退出。
再次输入git log查看 commit 历史信息,将会发现这涉及的 commit 已经合并了。

07 - 命令执行

  • 注意git命令的执行目录、生效目录和执行结果中的目录信息
  • 利用tab键补全目录、文件和命令名称
  • 使用完整的git命令,便于理解和确认

08 - 对比git pull和git pull --rebase

link
git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase

09 - 修改文件权限

# 在相应Repository目录中查看文件权限
git ls-tree HEAD

# 修改权限(权限修改后,相当于文件进入了index)
git update-index --chmod=+x <test.sh>

# 提交修改
git commit -m "script permission update"

# 确认修改结果
git ls-tree HEAD

10 - 报错:^M: bad interpreter

检查文件格式,必要时使用dos2unix命令转换文件格式。
在windows git下,建议关闭自动换行,并启用安全换行检查。

# 关闭自动换行的设置
git config --global core.autocrlf false

# 启用安全换行符检查
git config --global core.safecrlf true

11 - 15

11 - Git添加空文件夹

默认情况下,git将忽略空文件夹,也就是说空文件夹无法加入到repository。
解决办法:在空文件夹下创建包含!.gitignore内容的.gitignore文件即可。

12 - 从指定分支或提交检出单个文件

git checkout <branch-name> -- <file-name>
git checkout <commit-id> -- <file-name>

13 - [参考]工作流一目了然,动图展示10大Git命令

https://mp.weixin.qq.com/s/PUUL913fig6cFfqy4OKcGA

# 合并
- git merge
- Fast-forward (—ff)
- No-fast-foward (—no-ff)


# 合并冲突
- git merge ---> vi ---> git add ---> git commit


# 变基(Rebasing)
- git rebase
- 将一个分支的修改融入到另一个分支


# 交互式变基(Interactive Rebase) 
- git rebase -i
- 可以执行的动作:
        reword:修改提交信息;
        edit:修改此提交;
        squash:将提交融合到前一个提交中;
        fixup:将提交融合到前一个提交中,不保留该提交的日志消息;
        exec:在每个提交上运行我们想要 rebase 的命令;
        drop:移除该提交


# 重置(Resetting)
- 软重置(将 HEAD 移至指定的提交,而不会移除该提交之后加入的修改): git reset --soft
- 硬重置(将 HEAD 移至指定的提交,并且不保留该提交之后加入的修改): git reset --hard


# 还原(Reverting)
- git revert
- 对特定的提交执行还原操作,会创建一个包含已还原修改的新提交


# 拣选(Cherry-picking)
- git cherry-pick
- 在当前活动分支上创建一个新的提交,包含指定分支的某个提交的改动



# 取回(Fetching)
- git fetch
- 当远程分支上包含当前分支没有的提交时,可以使用fetch,在本地获取这些修改。
- 只是单纯地下载某个分支的新数据


# 拉取(Pulling)
- git pull
- 相当于git fetch 和 git merge,首先取回所有数据,然后最新的修改会自动合并到本地分支中


# Reflog
- git reflog
- 展示已经执行过的所有动作的日志,基本上包含对分支所做的任何修改
- 可以根据 reflog 提供的信息通过重置 HEAD 来轻松地重做

14 - cherry-pick

  • 当一个特定分支包含活动分支需要的某个提交时,可以对那个提交执行 cherry-pick!
  • 对一个提交执行 cherry-pick 时,会在活动分支上创建一个新的提交,其中包含由拣选出来的提交所引入的修改。
  • git cherry-pick 教程: http://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html
posted @ 2017-01-28 23:27  Anliven  阅读(277)  评论(0编辑  收藏  举报