{"id":11,"date":"2017-05-20T08:49:37","date_gmt":"2017-05-20T08:49:37","guid":{"rendered":"https:\/\/blogs.scummvm.org\/yinsimei\/?p=11"},"modified":"2022-05-24T08:53:15","modified_gmt":"2022-05-24T08:53:15","slug":"git-tips-keep-your-branch-clean-and-clear-for-a-pr","status":"publish","type":"post","link":"https:\/\/blogs.scummvm.org\/yinsimei\/2017\/05\/20\/git-tips-keep-your-branch-clean-and-clear-for-a-pr\/","title":{"rendered":"Git tips: keep your branch clean and clear for a PR"},"content":{"rendered":"<p>When contributing to a open source project, we should keep commits clean and clear in the pull request that we create. In this case,\u00a0<strong>rebase,<\/strong>\u00a0<strong>reset\u00a0<\/strong>are important git operations that we\u2019d better get familiar with.<\/p>\n<h1>Get to know about git-reset and git-rebase<\/h1>\n<h2>git-reset<\/h2>\n<p><a href=\"https:\/\/git-scm.com\/docs\/git-reset\">git-reset<\/a>\u00a0works with refs, on your working directory and the index, without touching any commit objects (or other objects).<\/p>\n<h2>git-rebase<\/h2>\n<p><a href=\"https:\/\/git-scm.com\/docs\/git-rebase\">git-rebase<\/a>\u00a0on the other hand is used to rewrite previously made commit objects. So if you want to rewrite the history, git-rebase is what you want. Note that you should never rewrite history that was pushed and was available to someone else, as rebasing rewrites the objects making them incompatible with the old objects, resulting in a mess for anyone else involved.<\/p>\n<h1>Some use case examples<\/h1>\n<p>Once we\u2019ve seen how basic operations work in git, there are a number of things that we can achieve with them.<\/p>\n<h3>Update a fork without pushing merge commit<\/h3>\n<div>\n<div id=\"highlighter_458178\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash comments\"># fetch<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"bash plain\">$ git fetch upstream <\/code><\/div>\n<div class=\"line number3 index2 alt2\"><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"bash comments\"># rebase branch on top of upstream\/master<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"bash plain\">$ git checkout myBranch git rebase upstream<\/code><code class=\"bash plain\">\/master<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"bash comments\"># force a push to update<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"bash plain\">$ git push -f<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<hr \/>\n<h2>Deal with\u00a0<strong>local<\/strong>\u00a0commits (unpushed)<\/h2>\n<h3>Undo commit(s)<\/h3>\n<p><strong>Undo last commit and abandon all the changes (never see them again)<br \/>\n<\/strong><\/p>\n<div>\n<div id=\"highlighter_968023\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash plain\">$ git reset --hard HEAD~1<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>Undo last commit and keep all the changes (to be reedited later)<br \/>\n<\/strong><\/p>\n<div>\n<div id=\"highlighter_146002\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash comments\"># leave the files alone<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"bash plain\">$ git reset HEAD~1<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"bash comments\"># leave the files and the index alone<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"bash plain\">$ git reset --soft HEAD~1<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<hr \/>\n<h2><strong>Deal with pushed commits (rewrite commit history)<\/strong><\/h2>\n<p>ATTENTION, for all the operations below, don\u2019t use them if someone has already pulled your change. Only for your personal repository. Else, we should use\u00a0<strong>revert\u00a0<\/strong>and create a relative commit for it.<\/p>\n<div>\n<div id=\"highlighter_560982\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash comments\"># revert one single commit<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"bash plain\">$ git revert &lt;commit_hash&gt;<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"bash comments\"># revert a range of commits<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"bash comments\"># &lt;oldest_commit_hash&gt; is the oldest commit that we want to keep and won't be removed<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"bash plain\">$ git revert &lt;oldest_commit_hash&gt;..&lt;latest_commit_hash&gt;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Suppose we work on the branch\u00a0<strong>myBranch<\/strong>\u00a0and command\u00a0<strong>git log<\/strong>\u00a0gives:<\/p>\n<div>\n<div id=\"highlighter_339131\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash plain\">commit eb6e1791690c2498891071ecc944bb381b413732<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"bash plain\">Author: AAA &lt;github.com@ccc.com&gt;\u00a0 Date: ...<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"bash plain\">Commit 6<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"bash plain\">commit 8c9e5dbe40fe4dfd83aa1425c6a71c9b271d33e7<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"bash plain\">Author: AAA &lt;aaa@gmail.com&gt;\u00a0 Date: ...<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"bash plain\">Commit 5<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"bash plain\">commit 53b0b82e8754e5e74dda2dedd9f7da726b068df7<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"bash plain\">Author: BBB &lt;bbb@gmail.com&gt;\u00a0 Date: ...<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"bash plain\">Commit 4<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"bash plain\">commit 2a7cda649ebea7997d5a6ac74c23569f2b0b83d9<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"bash plain\">Author: CCC &lt;ccc@scummvm.org&gt;\u00a0 Date: ...<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"bash plain\">Commit 3<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"bash plain\">commit c788642b72ea524d720e36b28bf9e87e7b06fd28<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"bash plain\">Author: DDD &lt;github.com@ddd.com&gt;\u00a0 Date: ...<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"bash plain\">Commit 2<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"bash plain\">commit b7638982c2a7b619494108224e956a95bec88f08<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"bash plain\">Author: EEE &lt;github@bbb.n&gt;\u00a0 Date: ...<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"bash plain\">Commit 1<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3><\/h3>\n<h3>Squash several commits<\/h3>\n<h4><strong>Squash last 3 commits<\/strong>:<\/h4>\n<div>\n<div id=\"highlighter_700528\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash comments\"># rewrite history for last 3 commits<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"bash plain\">$ git rebase -i HEAD~3<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Then, text editor will show you:<\/p>\n<div>\n<div id=\"highlighter_167914\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash plain\">pick eb6e179 Commit 6<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"bash plain\">pick 8c9e5db Commit 5<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"bash plain\">pick 53b0b82 Commit 4<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Change it to:<\/p>\n<div>\n<div id=\"highlighter_151187\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash comments\"># squash commit 4 5 into commit 6<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"bash plain\">pick eb6e179 Commit 6<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"bash plain\">squash 8c9e5db Commit 5<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"bash plain\">squash 53b0b82 Commit 4<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Save and quit. Done.<\/p>\n<h4><strong>Squash all commits in a branch into one commit :<\/strong><\/h4>\n<div>\n<div id=\"highlighter_180438\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash plain\">$ git checkout myBranch<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"bash plain\">$ git reset $(git merge-base master myBranch)<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"bash plain\">$ git add -A<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"bash plain\">$ git commit -m <\/code><code class=\"bash string\">\"one commit on myBranch\"<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4><strong>Squash commits 2 4 6 into one single commit (non consecutive commits)<\/strong>:<\/h4>\n<div>\n<div id=\"highlighter_235348\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash comments\"># rewrite history for last 5 commits(2 3 4 5 6)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"bash plain\">$ git rebase -i HEAD~5<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Then, text editor will show us:<\/p>\n<div>\n<div id=\"highlighter_438010\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash plain\">pick eb6e179 Commit 6<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"bash plain\">pick 8c9e5db Commit 5<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"bash plain\">pick 53b0b82 Commit 4<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"bash plain\">pick 2a7cda6 Commit 3<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"bash plain\">pick c788642 Commit 2<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Reorder commits to be squashed together:<\/p>\n<div>\n<div id=\"highlighter_560307\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash plain\">pick 8c9e5db Commit 5<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"bash plain\">pick 2a7cda6 Commit 3<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"bash plain\">pick eb6e179 Commit 6<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"bash plain\">squash 53b0b82 Commit 4<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"bash plain\">squash c788642 Commit 2<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Save and quit. Done<\/p>\n<h3><\/h3>\n<h3>Remove commit(s)<\/h3>\n<h4><strong>Remove last commit(s) :<\/strong><\/h4>\n<div>\n<div id=\"highlighter_315776\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash comments\"># Get back to the last known good commit(Commit 4 for example, so 5 6 are removed)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"bash plain\">$ git push -f origin 53b0b82e8754e5e74dda2dedd9f7da726b068df7:myBranch<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4><strong>Remove commits 2 4 6 (use rebase) :<\/strong><\/h4>\n<div>\n<div id=\"highlighter_530962\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash comments\"># rewrite history for last 5 commits(2 3 4 5 6)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"bash plain\">$ git rebase -i HEAD~5<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Then, text editor will show us:<\/p>\n<div>\n<div id=\"highlighter_978108\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash plain\">pick eb6e179 Commit 6<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"bash plain\">pick 8c9e5db Commit 5<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"bash plain\">pick 53b0b82 Commit 4<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"bash plain\">pick 2a7cda6 Commit 3<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"bash plain\">pick c788642 Commit 2<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Delete all the lines of unwanted commits:<\/p>\n<div>\n<div id=\"highlighter_440582\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash plain\">pick 8c9e5db Commit 5<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"bash plain\">pick 2a7cda6 Commit 3<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Save and quit. Done.<\/p>\n<h4><strong>Remove commits 2 4 6 (use cherry-pick):<\/strong><\/h4>\n<div>\n<div id=\"highlighter_754815\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash plain\">$ git checkout myBranch<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"bash comments\"># checkout the last usable commit (Commit 1)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"bash plain\">$ git checkout b7638982c2a7b619494108224e956a95bec88f08<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"bash comments\"># create a new branch to work on<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"bash plain\">$ git checkout -b repair<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"bash comments\"># cherry pick commits that we want to keep (Commmit 3 5)<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"bash plain\">$ git cherry-pick 2a7cda649ebea7997d5a6ac74c23569f2b0b83d9<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"bash plain\">$ git cherry-pick 8c9e5dbe40fe4dfd83aa1425c6a71c9b271d33e7<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"bash comments\"># back to myBranch<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"bash plain\">$ git checkout myBranch<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"bash comments\"># reset myBranch to last usable commit (Commit 1)<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"bash plain\">$ git reset --hard b7638982c2a7b619494108224e956a95bec88f08<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"bash comments\"># merge our repair branch onto myBranch<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"bash plain\">$ git merge repair<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"bash comments\"># push to update<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"bash plain\">$ git push --hard origin myBranch<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<hr \/>\n<p>&nbsp;<\/p>\n<h1>Resources:<\/h1>\n<ul>\n<li><a href=\"https:\/\/sethrobertson.github.io\/GitFixUm\/fixup.html\">On undoing, fixing, or removing commits in git<\/a><\/li>\n<li><a href=\"https:\/\/gist.github.com\/CristinaSolana\/1885435\">How to keep your fork up to date<\/a><\/li>\n<li><a href=\"http:\/\/stackoverflow.com\/questions\/23997119\/updating-a-local-fork-without-pushing-merge-commits\">How to updating a fork without pushing merge commits<\/a><\/li>\n<li><a href=\"https:\/\/www.clock.co.uk\/insight\/deleting-a-git-commit\">Delete a particular commit<\/a><\/li>\n<li><a href=\"http:\/\/stackoverflow.com\/questions\/22682870\/git-undo-pushed-commits\">Undo pushed commits<\/a><\/li>\n<li><a href=\"https:\/\/www.devroom.io\/2011\/07\/05\/git-squash-your-latests-commits-into-one\/\">Squash lastest commits into one<\/a><\/li>\n<li><a href=\"http:\/\/stackoverflow.com\/questions\/25356810\/git-how-to-squash-all-commits-on-branch\">Squash all commits in one branch into one commit<\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=uTF03VXiuGg&amp;list=PLq0VzNtDZbe9QLq8YCizFN2TVWvlLjrvX\">Git tutorial Youtube playlist<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>When contributing to a open source project, we should keep commits clean and clear in the pull request that we create. In this case,\u00a0rebase,\u00a0reset\u00a0are important git operations that we\u2019d better get familiar with. Get to know about git-reset and git-rebase git-reset git-reset\u00a0works with refs, on your working directory and the index, without touching any commit [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-11","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/blogs.scummvm.org\/yinsimei\/wp-json\/wp\/v2\/posts\/11","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.scummvm.org\/yinsimei\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.scummvm.org\/yinsimei\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.scummvm.org\/yinsimei\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.scummvm.org\/yinsimei\/wp-json\/wp\/v2\/comments?post=11"}],"version-history":[{"count":1,"href":"https:\/\/blogs.scummvm.org\/yinsimei\/wp-json\/wp\/v2\/posts\/11\/revisions"}],"predecessor-version":[{"id":12,"href":"https:\/\/blogs.scummvm.org\/yinsimei\/wp-json\/wp\/v2\/posts\/11\/revisions\/12"}],"wp:attachment":[{"href":"https:\/\/blogs.scummvm.org\/yinsimei\/wp-json\/wp\/v2\/media?parent=11"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.scummvm.org\/yinsimei\/wp-json\/wp\/v2\/categories?post=11"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.scummvm.org\/yinsimei\/wp-json\/wp\/v2\/tags?post=11"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}