Live data from Hacker News

Ask HN: How to Teach Git Rebase

news.ycombinator.com

1–10 of 14 posts

Ask HN: How to Teach Git Rebase

#1
One of the projects I work on has a Git Rebase workflow. Developers looking to get their changes into the main branch:

1. Do a rebase to get their branch in-sync with main, 2. Squash their branch's commits, 3. Make a push/force push to their branch, and 4. Create a pull request.

Which is lovely, but the process has a gnarly learning curve for our junior devs.

Is anyone familiar with documentation or tooling that does a good job of streamlining this sort of workflow?

Re: Ask HN: How to Teach Git Rebase

#6
If by any chance you use zsh, oh-my-zsh, and its git plugin, I can offer you this function:

  function stash_and_rebase() {
    local current_branch="$(git_current_branch)"
    if (( ${#current_branch} == 0 )); then
      echo "There is no current branch. This script must be executed in git repo."
      return 1
    fi
    if (( $# == 0 )); then
      local target_branch="$(git_main_branch)"
    else
      local target_branch="$1"
    fi
    git stash push
    git fetch --all
    git rebase origin/${target_branch}
    echo "Don't forget to execute 'git stash pop' after rebase!"
  }
Let's say you want to rebase onto `main`. Checkout your feature branch and run `stash_and_rebase`. If you want to rebase onto non-main branch, run `stash_and_rebase branchX`. If everything went OK, do `git stash pop` in the end.

N.B. This doesn't do squash!

Re: Ask HN: How to Teach Git Rebase

#7
I think visualization is very useful when dealing with this sort of thing, I found this stackoverflow answer: https://stackoverflow.com/a/29916361 very useful, because of the ascii art for visualizing the rebase, and the mnemonic device for each "version" of a rebase (like calling the git rebase --onto w/ 3 arguments "the surgeon")

Re: Ask HN: How to Teach Git Rebase

#8
I feel dirty anytime I put '--force' and I encourage workflows that don't mess with history. In every code base I've been in, it is just more straightforward to squash merge smaller, self-contained, commits into your main branch. Tests should act as a gate for committing to the main branch.

Re: Ask HN: How to Teach Git Rebase

#9
Assuming devs are familiar with the usual branch/commit/push workflow, and history rewrites like rebase/cherry-picking are the point of confusion:

I can't recommend highly enough Learn Git Branching[1], an interactive demo for understanding rebases and cherry-picks.

Then try it a couple of tricky times, and you're settled.

[1]: https://learngitbranching.js.org/

Re: Ask HN: How to Teach Git Rebase

#10

I feel dirty anytime I put '--force' and I encourage workflows that don't mess with history. In every code base I've been in, it is just more straightforward to squash merge smaller, self-contained, commits into your main branch. Tests should act as a gate for committing to the main branch.

I agree. Part of the motivation for this post is that I've been doing triage on a maimed branch that got incorrectly squashed.

That being said, the workflow for this project is unlikely to change. And, to be fair, the workflow has its benefits. The project history is very clean, PR code reviews are straightforward, etc.

Post reply on HN