Git 挑选那些包含关键字(跟踪 ID)的提交

Git cherry pick those commits that contain a keyword (tracking id)

出于代码审查的目的,我想

  1. cherry pick 特定提交
  2. 与他们一起创建一个新分支
  3. 将该分支推送到远程

以便我可以将分支 url 交给同行审阅。

我想创建一个 shell 脚本并发出像

这样的简单命令
git-review <trackingID>

输出如下

Branch <currentgitusername>_<trackingID> created and pushed to remote.

我整理了一个执行上述步骤的脚本。

#!/bin/bash

if [ -z  ]; then
    echo "Rationale: Cherry pick all commits in master, matching the tracking ID and create a new branch.";
    echo "";
    echo "Usage:  [=13=] traackingID";
    echo "";
    exit 1;
fi

#If  doesn't match a AGW-<number> pattern, thrown an error
#Best of luck if you did not add add tracking ID in commits.

user="$(id -u -n)" > /dev/null

echo "You are - $user"

branchname=$user"_""_review"

echo "Creating branch - $branchname"

git checkout -b $branchname > /dev/null

git log master --pretty=%H --grep="" | while read rev
do
  echo $rev
 # git cherry-pick $rev > /dev/null
done

#git push &> /dev/null

echo "Created branch, cherry picked, pushed to remote. Now switching back to master. Bye."

git checkout master

但是卡在了几个地方。

  1. 我想验证 trackingID 格式。应该是AGW-<somenumber>
  2. 看起来 cherry-picks 有合并问题。

    myname@mymachine ~/myproj
    $ ../git-review.sh AGW-1234
    You are - myname
    Creating branch - myname_AGW-1234_review
    Switched to a new branch 'myname_AGW-1234_review'
    2dfafa89e10062e7cfccb1d7a947ebb848c40cc6
    The previous cherry-pick is now empty, possibly due to conflict resolution.
    If you wish to commit it anyway, use:
    
        git commit --allow-empty
    
    Otherwise, please use 'git reset'
    1e295000bc3d80880518c9cac5e34ef3b28fc29e
    error: Your local changes to the following files would be overwritten by merge:
            rest-service/src/main/java/package/HealthCheckDAOImpl.java
    Please, commit your changes or stash them before you can merge.
    

我是不是采摘樱桃的方式不对?另外,请提出任何更改建议以使此脚本更健壮。

正如@novelocrat 在评论中指出的那样,您采摘的顺序错误。默认情况下,git 日志将从最新的提交输出到第一次提交。为此,要么将 git log --oneline 的输出输入到 tac,要么使用 --reverse 标志:

git log --oneline | tac
git log --oneline --reverse

第二个选项显然是首选,因为它确保逐行输出,而第一个(使用 tac)需要一次性输入所有内容。


此外,由于您是在 master 之外创建一个新分支,因此当您执行 git checkout -b $branchname.

当您这样做时,当前分支的所有历史记录都会从中选取。

因此您需要创建一个孤立的 git 分支,like mentioned here