Apes are responsible for maintaining neat Git submission records. Three brochures are for you

background

Everyone has learned how to write code in a standard and concise way, but they rarely learn how to submit code in a standard and concise way. Now we basically use git as a tool for source code management. Git provides great flexibility. We submit / merge codes according to various workflow s. This flexibility is not well controlled and will also bring many problems

The most common problem is the messy git log history. It's really an old lady's foot binding. It's smelly and long. I don't like this log very much

The root cause of this problem is random code submission.

The code has been submitted. Is there any way to save it? Three brocade bags can be solved perfectly

Make good use of git commit --amend

The help document for this command is described as follows:

--amend               amend previous commit

In other words, it can help us modify the last submission

You can modify both the message we submitted and the file we submitted, and finally replace the last commit ID

We may miss a file when submitting. When we submit again, we may have multiple useless commit IDs. If everyone does this, the git log will slowly become chaotic and unable to track the complete function

Suppose we have such a log information

* 98a75af (HEAD -> feature/JIRA123-amend-test) feat: [JIRA123] add feature 1.2
* 119f86e feat: [JIRA123] add feature 1.1
* 5dd0ad3 feat: [JIRA123] add feature 1
* c69f53d (origin/main, origin/feature/JIRA123-amend-test, origin/HEAD, main) Initial commit

Suppose we want to modify the last log message, we can use the following command:

git commit --amend -m "feat: [JIRA123] add feature 1.2 and 1.3"

Let's look at the log information again. We can find that we replaced the old commit ID 98a75af with the new commit ID 5e354d1, modified the message, and did not add nodes

* 5e354d1 (HEAD -> feature/JIRA123-amend-test) feat: [JIRA123] add feature 1.2 and 1.3
* 119f86e feat: [JIRA123] add feature 1.1
* 5dd0ad3 feat: [JIRA123] add feature 1
* c69f53d (origin/main, origin/feature/JIRA123-amend-test, origin/HEAD, main) Initial commit

Now the file in our repo is as follows:

.
├── README.md
└── feat1.txt

0 directories, 2 files

Suppose that when we submit feature 1.3, we forget a configuration file config.yaml, do not want to modify the log, and do not want to add a new commit ID, then the following command is very easy to use

echo "feature 1.3 config info" > config.yaml
git add .
git commit --amend --no-edit

Git commit -- amend -- no edit is the soul. Take a look at the current repo file:

.
├── README.md
├── config.yaml
└── feat1.txt

0 directories, 3 files

Take another look at git log

* 247572e (HEAD -> feature/JIRA123-amend-test) feat: [JIRA123] add feature 1.2 and 1.3
* 119f86e feat: [JIRA123] add feature 1.1
* 5dd0ad3 feat: [JIRA123] add feature 1
* c69f53d (origin/main, origin/feature/JIRA123-amend-test, origin/HEAD, main) Initial commit

Knowing this technique will ensure that every submission contains valid information. A diagram describes the process as follows:

With the buff bonus of -- no edit, it's more powerful

Make good use of git rebase -i

You can see that the above logs are developing feature1. We should continue to merge the log commit node before merging the feature branch to the main branch. This is used

git rebase -i HEAD~n

Where n represents the last few submissions. We have three submissions for feature 1 above, so you can use:

git rebase -i HEAD~3

After running, a vim editor will be displayed as follows:

  1 pick 5dd0ad3 feat: [JIRA123] add feature 1
  2 pick 119f86e feat: [JIRA123] add feature 1.1
  3 pick 247572e feat: [JIRA123] add feature 1.2 and 1.3
  4
  5 # Rebase c69f53d..247572e onto c69f53d (3 commands)
  6 #
  7 # Commands:
  8 # p, pick <commit> = use commit
  9 # r, reword <commit> = use commit, but edit the commit message
 10 # e, edit <commit> = use commit, but stop for amending
 11 # s, squash <commit> = use commit, but meld into previous commit
 12 # f, fixup <commit> = like "squash", but discard this commit's log message
 13 # x, exec <command> = run command (the rest of the line) using shell
 14 # d, drop <commit> = remove commit
 15 # l, label <label> = label current HEAD with a name
 16 # t, reset <label> = reset HEAD to a label
 17 # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
 18 # .       create a merge commit using the original merge commit's
 19 # .       message (or the oneline, if no original merge commit was
 20 # .       specified). Use -c <commit> to reword the commit message.
 21 #
 22 # These lines can be re-ordered; they are executed from top to bottom.
 23 #
 24 # If you remove a line here THAT COMMIT WILL BE LOST.
 25 #
 26 #   However, if you remove everything, the rebase will be aborted.
 27 #
 28 #
 29 # Note that empty commits are commented out

The most common ways to merge commit IDs are squash and fixup. The former contains commit message, while the latter does not. Here, use fixup, and then: wq exit

  1 pick 5dd0ad3 feat: [JIRA123] add feature 1
  2 fixup 119f86e feat: [JIRA123] add feature 1.1
  3 fixup 247572e feat: [JIRA123] add feature 1.2 and 1.3

Let's take another look at the log, which is very clear

* 41cd711 (HEAD -> feature/JIRA123-amend-test) feat: [JIRA123] add feature 1
* c69f53d (origin/main, origin/feature/JIRA123-amend-test, origin/HEAD, main) Initial commit

Make good use of rebase

The above feature1 has been completely developed, and the main branch has been updated by others. Before returning the feature merge to the main branch, in case of code conflict, you need to merge the contents of the main branch into the feature. If you use the merge command, there will be multiple merge nodes, and inflection points will appear in the log history, which is not linear, So here we can use the rebase command on the feature branch

git pull origin main --rebase

The back of the pull command is to automatically do merge for us, but here in the form of rebase, let's take a look at the log

* d40daa6 (HEAD -> feature/JIRA123-amend-test) feat: [JIRA123] add feature 1
* 446f463 (origin/main, origin/HEAD) Create main.properties
* c69f53d (origin/feature/JIRA123-amend-test, main) Initial commit

Our feature1 function remains linear at the submission node of on top of main. Next, you can push the code, and then raise PR to merge your feature into the main branch

Briefly describe the difference between merge and rebase as follows:

I use git pull origin main --rebase here, omitting the process of switching main, pulling the latest content and then cutting back. The principle behind it is shown in the figure above

Using rebase is to follow a golden rule, which has been mentioned before, so it is no longer repeated

summary

With these three brochures, I believe everyone's git log is extremely clear. If you don't know it, you can use it. If members of your group don't know it, you can promote it. This repo looks healthier

Next, we will introduce a brocade bag in which multi branch switching does not affect each other
Personal blog: https://dayarch.top
Add my wechat friend , join the group for entertainment, learning and communication, and note "join the group"

Welcome to keep public official account: "day arch one soldier".

  • Cutting edge Java technology dry goods sharing
  • Summary of efficient tools | reply to "tools"
  • Analysis and answer of interview questions
  • Technical data collection | reply to "data"

Learn about Java technology stack by reading detective stories with ease and interest, and gradually decompose technical problems based on the principles of simplifying complex problems, concreting abstract problems and graphing them. The technology is continuously updated. Please pay continuous attention

Posted on Sun, 21 Nov 2021 20:31:54 -0500 by rich11