开发者

How to step through a git repository?

开发者 https://www.devze.com 2023-01-08 08:52 出处:网络
I am trying to understand a project, it helps to look at its evolution by using gitk. What I do is checkout the first commit, understand code, run tests, go to next commit and repeat. Mycurrent workfl

I am trying to understand a project, it helps to look at its evolution by using gitk. What I do is checkout the first commit, understand code, run tests, go to next commit and repeat. My current workflow is to checkout the commi开发者_运维知识库t through its hash

git checkout 79cd6

But what I would like is another branch where I can perform my own changes, and allows me to merge commits from the master branch, but without the need to find the commit hash. Idealized workflow:

git checkout -b <newbranch> <first commit id of master>
git <command to move head of current branch to next commit of master>


I know this is a bit of an old question, but I wanted to do the same thing and found an answer so I figured I'd share.

for commit in $(git rev-list master --reverse)
do
    git checkout $commit
    read
done

do this in one window. It will start with your initial commit, and advance once each time you hit enter. Then do your testing etc. in a different shell.
It'll work perfectly with a linear history, but I'm not quite sure how it will handle merges and such. I'm sure it'll be reasonable, but your mileage might vary a bit.


Save this as ~/bin/git-next or somewhere else in your path:

#!/bin/bash
git co $(git rev-list --children --all | awk "/^$(git rev-parse @\{0})/ { print \$2; }")

This will check out the first child of the current revision.

It will be very slow on a big repo but it will do the job.

You can modify this to handle your branching as needed.


You could write a little shell script. One script would run git log --pretty=oneline | awk '{print $1;}'. The second script (call it step or something) would use head, tail, wc -l. Then read the last line of the file with tail, find out how many lines are in the file, and remove the last line from the file. Ugly, sure, but it'd do the job. :) (If you wanted to be a little less ugly, it could use truncate(1) to just chop off the last line of the file, rather than always making new temporary files.)


I wanted an easy way to step through commits in a branch for code review/demo. This is the little script I came up with to automate it. Drop the following in a file, say, git_step and run it like so: git_step d17dacce8b13b2ad454003da7cbd670a06c41437

#!/bin/bash

BASE_REV=${BASE_REV:-$1};
current_branch=$(git branch | grep '^*' | awk '{print $2}');

for rev in $(git rev-list ${BASE_REV}..HEAD | tail -r); do
    git checkout $rev;
    LESS='RSX' git show -p $rev;
done;

git checkout ${current_branch};

Also available as a gist here.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号