git 远程库

  • 代码推送至远程仓库

    1
    git push origin HEAD:refs/for/sandbox/zengruihua/master
  • 远程最新的 commit 以 rebase 的方式同步到本地

    1
    git pull --rebase

    使用命令时必须保持本地目录干净(不能有modified文件,可以存在untracked文件)

  • 拉取远程库
    要想有远程库信息,需要使用git clone

    1
    2
    git clone 远程库 && git cherry-pick FETCH_HEAD
    git fetch 远程库 && git checkout FETCH_HEAD

git add

1
git add -p

此命令用于交互式添加修改到暂存区的命令。-p 代表 “patch”,允许用户选择要包含在下一次提交中的每个修改

  • y:表示将当前的修改添加到暂存区,即标记为要提交;
  • n:表示不添加当前的修改到暂存区,即标记为不需要提交,跳过此次修改;
  • q:表示退出当前的 git add -p 对话框;
  • a: 表示添加当前和所有未列出的修改到暂存区,即全部标记为要提交;
  • d: 表示不添加当前和所有未列出的修改到暂存区,即全部标记为不需要提交,跳过此次修改;
  • e: 表示编辑当前修改,即便更好地确定所要提交的内容;
  • ?: 表示查看帮助信息,列出所有可用键和其含义
1
git rm --cached <文件路径>

从暂存区中删除 add 后的文件

git log

1
git log --oneline --decorate --graph --all

--oneline:表示只输出 git 提交说明的标题 (即提交说明的首行,我们约定,首行标题和正文之间必须空一行,否则 git 会将第二行之后也是为标题的一部分显示出来)

--decorate:会连同 git tag 一起显示,这里还没创建 tag,所以加不加效果一样

--graph:以分支图的形式显示 log, 这里因为只有一个分支,所以加不加效果一样

--all: 是显示所有分支的 log

查找代码在哪个提交中被删除

  • 方法一
    1
    git log -S "代码" $file_path
  • 方法二(手动)
    1
    2
    3
    1. git log --oneline $filepath 得到所有commit,对所有 commit 执行:
    2. git show $commit $file_path >> tmp/yx
    3. 再在文件中搜索对应代码

git reset

1
2
3
4
5
6
7
8
# --hard 选项的作用就是保证在移动 HEAD 和分支指向的同事,让暂存区和工作去的内容和版本库(即 HEAD 指向的提交的目录树)一致)
git reset --hard commitid(branch)

# --soft 选项的效果只是移动 HEAD 和分支的指向,并不会改变暂存区和工作区。相当于直接把版本库回退,用于将多个提交压缩成一个提交
git reset --soft commitid(branch)

# --mixed 改变暂存区而不改变工作区,gti rsest --mixed commit 可以简写为 git resst commit,其也可以用于将多个提交压缩成一个提交,先 reset 回退若干提交,比 --soft,多了一步,需要先 git add 后才能 commit
git reset --mixed commitid(branch)

git checkout

  • 切换分支或者恢复工作树文件

    1
    2
    # 如果是commitid就会使分离头指针
    git checkout commit(branch)

    该命令在变更HEAD指向之外,同时会将工作区的内容修改成和HEAD指向(直接指向或者间接指向)的提交的树的内容一致)

    1
    2
    # 这里的参数 pathspec 是特定文件,commit(branch)是特定文件所在的分支或提交
    git checkout commit(branch) pathspec

    此命令带上指定路径,泽 HEAD 就不会移动了,即此操作不影响版本库。在实际工作中,我们使用带上 pathspec 选项的 git checkout 命令检出特定提交的文件到工作区,使用不带 pathspec 选项的 git checkout 命令切换分支。

    1
    2
    # <start_point> 省略相当于 <start_point>=HEAD?
    git checkout -b new_branch start_point

    此命令是 git branch new_branch start_point 和 git checkout new_branch 两个命令的组合,相当于新建一个分支,并变更 HEAD 指向,同时会将工作区的内容修改成和HEAD指向一致

  • 放弃修改

    放弃工作区全部的修改

    1
    git checkout .

    放弃工作区中某个文件的修改

    1
    git chekout --filename

git diff

配置 git diff 使用外部工具

取消配置 git diff 使用外部工具

  • 临时禁用外部 diff 工具,通过 –no-ext-diff 禁用外部 diff 工具

    1
    git diff --no-ext-diff <script.sh>
  • 永久禁用

    • 取消 GIT_EXTERNAL_DIFF 环境变量

    • 执行 git config

    • git config –global –unset diff.external

命令

1
2
3
4
5
6
7
8
# 工作区和暂存区差异
git diff

# 暂存区和版本库(HEAD)指向的提交的目录树
git diff --cached

# 工作区和版本库
git diff HEAD

git commit –amend

修补式提交

git cherry-pick

应用提交

1
git cherry-pick commit

git revert

如果要撤销的提交已经被合入远程版本库,那么就不能被reset或者rebase了,因为这会改变已入库的提交的历史,会改变团队共同工作的基准

在实际工作中,我们一般使用 git revert 命令来撤销已经入库的提交。在提交未入库前,无必要使用此命令。使用其他的命令整理提交即可,git revert 是在提交已经被入库后而还想撤销时,不得已的做法。

git show

可以查看提交的 git log

1
git show commit

git branch

重命名分支

1
git branch -m old_branch new_branch

强制移动分支

1
git branch -f branch_name newcommit

git patch

检查补丁状态

1
git apply --stat patch_name.patch

检查补丁是否可打入

1
git apply --check patch_name.patch

正式打入

1
git apply patch_name.patch

如果使用 diff 打 patch,会提示补丁片段没有有信息:@@-1,5 +1,5@@,需要删除文件路径和 @@-1,5 +1,5@@ 之间的空行

打补丁

1
patch -p1 < 26004743.diff/patch

恢复源文件

1
patch -RE -p1 < 26004743.diff/patch

git stash

保存当前工作目录到一个新的 stash

1
2
3
# 默认提交名
git stash
git stash save "message"

查看当前保存的所有 stash 列表

1
git stash list

删除某个 stash, 从 stash 列表中移除,如果不指定 stash,默认会删除最新的 stash

1
git stash drop [stash]

others

查看暂存区内容

1
2
3
git ls-files --stage
git cat-file -t commitid # 查看 git 对象类型
git cat-file -p commitid # 查看 git 对象内容

撤销将未被纳入版本控制的文件加入暂存区的动作

1
2
# --cached 选项表示是从暂存区中移除
git rm --cached readme.txt

查看提交

1
2
# git show = git show head
git show commit

组合技

将 Gerrit 修改的文件拷贝至文件夹中

1
2
mkdir yxyx
git show --pretty="format:" --name-only | xargs -I{} cp {} ./yxyx/

查看机型是否开启某想功能配置

1
2
cd /torchlight/product_config
find . -name "*.config" | xargs grep CONFIG_XX | grep y