Git Command之Code Review

原文链接

准备

  • Step 1. Create a team and add a teammate
  • Step 2. Create a repository with some content

应用

Clone and make a change on a new branch

  • Step 1. Clone your repository to your local system
  • Step 2. Create a branch and pull in locally
  • Step 3. Make a change to the branch

Create a pull request to merge your change

  • Step 1. Create the pull request
  • Step 2. Merge your pull request

Git Log

If you don’t like the default git log format, you can use git config’s aliasing functionality to create a shortcut for any of the formatting options discussed below

which git log’s output can be formatted

  • Oneline:The --oneline flag condenses each commit to a single line. 

    • By default, it displays only the commit ID and the first line of the commit message.
    • This is very useful for getting a high-level overview of your project.
    • 0e25143 Merge branch 'feature'
      ad8621a Fix a bug in the feature
      16b36c6 Add a new feature
      23ad9ad Add the initial code base
      

       

  • Decorating:The --decorate flag makes git log display all of the references (e.g., branches, tags, etc) that point to each commit.

    • Many times it’s useful to know which branch or tag each commit is associated with. 
    • This can be combined with other configuration options.
    • For example, running git log --oneline --decorate will format the commit history like so:
      • This lets you know that the top commit is also checked out (denoted by HEAD) and that it is also the tip of the master branch. The second commit has another branch pointing to it called feature, and finally the 4th commit is tagged as v0.9.
      • 0e25143 (HEAD, master) Merge branch 'feature'
        ad8621a (feature) Fix a bug in the feature
        16b36c6 Add a new feature
        23ad9ad (tag: v0.9) Add the initial code base
        
    • Branches, tags, HEAD, and the commit history are almost all of the information contained in your Git repository, so this gives you a more complete view of the logical structure of your repository.  

  • Diffs:The git log command includes many options for displaying diffs with each commit. 

    • Two of the most common options are --statand -p.
      • The --stat option displays the number of insertions and deletions to each file altered by each commit (note that modifying a line is represented as 1 insertion and 1 deletion).
        • This is useful when you want a brief summary of the changes introduced by each commit. 
        • For example, the following commit added 67 lines to the hello.py file and removed 38 lines:
          • The amount of + and - signs next to the file name show the relative number of changes to each file altered by the commit. 
          • This gives you an idea of where the changes for each commit can be found.
          • commit f2a238924e89ca1d4947662928218a06d39068c3
            Author: John <john@example.com>
            Date: Fri Jun 25 17:30:28 2014 -0500
            
             Add a new feature
            
             hello.py | 105 ++++++++++++++++++++++++-----------------
             1 file changed, 67 insertion(+), 38 deletions(-)
            
      • This gives you an idea of where the changes for each commit can be found.you can pass the -p option to git log. 

        • This outputs the entire patch representing that commit:
        • For commits with a lot of changes, the resulting output can become quite long and unwieldy. More often than not, if you’re displaying a full patch, you’re probably searching for a specific change. For this, you want to use the pickaxe option.
        • commit 16b36c697eb2d24302f89aa22d9170dfe609855b
          Author: Mary <mary@example.com>
          Date: Fri Jun 25 17:31:57 2014 -0500
          
           Fix a bug in the feature
          
          diff --git a/hello.py b/hello.py
          index 18ca709..c673b40 100644
          --- a/hello.py
          +++ b/hello.py
          @@ -13,14 +13,14 @@ B
          -print("Hello, World!")
          +print("Hello, Git!")
  • The Shortlog:The git shortlog command is a special version of git logintended for creating release announcements. 

    •  It groups each commit by author and displays the first line of each commit message.This is an easy way to see who’s been working on what.
    • For example, if two developers have contributed 5 commits to a project, the git shortlog output might look like the following:
      • Mary (2):
         Fix a bug in the feature
         Fix a serious security hole in our framework
        
        John (3):
         Add the initial code base
         Add a new feature
         Merge branch 'feature'
    • By default, git shortlog sorts the output by author name, but you can also pass the -n option to sort by the number of commits per author.
  • Graphs:The --graph option draws an ASCII graph representing the branch structure of the commit history.

    • This is commonly used in conjunction with the --oneline and --decorate commands to make it easier to see which commit belongs to which branch:
    • For a simple repository with just 2 branches, this will produce the following:
      • git log --graph --oneline --decorate
        
        * 0e25143 (HEAD, master) Merge branch 'feature'
        |\ 
        | * 16b36c6 Fix a bug in the new feature
        | * 23ad9ad Start a new feature
        * | ad8621a Fix a critical security issue
        |/ 
        * 400e4b7 Fix typos in the documentation
        * 160e224 Add the initial code base
      • The asterisk shows which branch the commit was on, so the above graph tells us that the 23ad9ad and 16b36c6 commits are on a topic branch and the rest are on the master branch.
    • While this is a nice option for simple repositories, you’re probably better off with a more full-featured visualization tool like gitk or Sourcetree for projects that are heavily branched.
  • Custom Formatting:For all of your other git log formatting needs, you can use the --pretty=format:"<string>" option.

    • This lets you display each commit however you want using printf-style placeholders.
    • For example, the %cn%h and %cd characters in the following command are replaced with the committer name, abbreviated commit hash, and the committer date, respectively.
      • git log --pretty=format:"%cn committed %h on %cd"
        
        John committed 400e4b7 on Fri Jun 24 12:30:04 2014 -0500
        John committed 89ab2cf on Thu Jun 23 17:09:42 2014 -0500
        Mary committed 180e223 on Wed Jun 22 17:21:19 2014 -0500
        John committed f12ca28 on Wed Jun 22 13:50:31 2014 -0500
    • The complete list of placeholders can be found in the Pretty Formats section of the git log manual page.
    • Aside from letting you view only the information that you’re interested in, the --pretty=format:"<string>" option is particularly useful when you’re trying to pipe git log output into another command.

 

Filtering the Commit History

  • By Amount:The most basic filtering option for git log is to limit the number of commits that are displayed.

    •  When you’re only interested in the last few commits, this saves you the trouble of viewing all the commits in a page.
    • You can limit git log’s output by including the -<n> option.
    • For example, the following command will display only the 3 most recent commits.
      • git log -3
  • By Date:If you’re looking for a commit from a specific time frame, you can use the --after or --before flags for filtering commits by date. 

    • These both accept a variety of date formats as a parameter.
    • For example, the following command only shows commits that were created after July 1st, 2014 (inclusive):
      • git log --after="2014-7-1"
        
        
        git log --after="yesterday"
        
        
        git log --after="2014-7-1" --before="2014-7-4"
    • You can also pass in relative references like "1 week ago" and "yesterday":
    • To search for a commits that were created between two dates, you can provide both a --before and --after date. 
    • Note that the --since and --until flags are synonymous with --after and --before, respectively.
  • By Author:When you’re only looking for commits created by a particular user, use the --author flag.

    • This accepts a regular expression, and returns all commits whose author matches that pattern.
    • If you know exactly who you’re looking for, you can use a plain old string instead of a regular expression
      • git log --author="John"
      • This displays all commits whose author includes the name John. The author name doesn’t need to be an exact match—it just needs to contain the specified phrase.
    • You can also use regular expressions to create more complex searches. 
      • For example, the following command searches for commits by either Mary or John.
        • git log --author="John\|Mary"
        • Note that the author’s email is also included with the author’s name, so you can use this option to search by email, too.
    • If your workflow separates committers from authors, the --committer flag operates in the same fashion.
  • By Message:To filter commits by their commit message, use the --grep flag. 

    • This works just like the --author flag discussed above, but it matches against the commit message instead of the author.
    • For example, if your team includes relevant issue numbers in each commit message, you can use something like the following to pull out all of the commits related to that issue:
      • git log --grep="JRA-224:"
    • You can also pass in the -i parameter to git log to make it ignore case differences while pattern matching.
  • By File:Many times, you’re only interested in changes that happened to a particular file. 

    • To show the history related to a file, all you have to do is pass in the file path.
    • For example, the following returns all commits that affected either the foo.py or the bar.py file:
      • git log -- foo.py bar.py
    • The -- parameter is used to tell git log that subsequent arguments are file paths and not branch names.
      • If there’s no chance of mixing it up with a branch, you can omit the --.
  • By Content:

    • It’s also possible to search for commits that introduce or remove a particular line of source code.This is called a pickaxe, and it takes the form of -S"<string>"
    •  For example, if you want to know when the string Hello, World! was added to any file in the project, you would use the following command:
      • git log -S"Hello, World!"
    • If you want to search using a regular expression instead of a string, you can use the -G"<regex>" flag instead.
    • This is a very powerful debugging tool, as it lets you locate all of the commits that affect a particular line of code. It can even show you when a line was copied or moved to another file.
  • By Range:You can pass a range of commits to git log to show only the commits contained in that range. 

    • The range is specified in the following format, where <since> and <until> are commit references:
    • git log <since>..<until>
    • This command is particularly useful when you use branch references as the parameters.
      • It’s a simple way to show the differences between 2 branches.
        • git log master..feature
        • The master..feature range contains all of the commits that are in the feature branch, but aren’t in the master branch. In other words, this is how far feature has progressed since it forked off of master.
        • Note that if you switch the order of the range (feature..master), you will get all of the commits in master, but not in feature.
    •  If git log outputs commits for both versions, this tells you that your history has diverged.
  • Filtering Merge Commits

    • By default, git log includes merge commits in its output.
    • But, if your team has an always-merge policy (that is, you merge upstream changes into topic branches instead of rebasing the topic branch onto the upstream branch), you’ll have a lot of extraneous merge commits in your project history
      • You can prevent git log from displaying these merge commits by passing the --no-merges flag:
        • git log --no-merges
    • On the other hand, if you’re only interested in the merge commits, you can use the --merges flag:
      • git log --merges
      • This returns all commits that have at least two parents.

 These new skills are an important part of your Git toolkit, but remember that git log is often used in conjunction other Git commands. 

 Once you’ve found the commit you’re looking for, you typically pass it off to git checkoutgit revert, or some other tool for manipulating your commit history.

 

 

Git log 应用

  • Git command may help during the code review:
    • #Hint: sample script in git bash (List the files commited by Xuan in platform v2.3 branch in the week): 
      git log  --branches=*v2.3*  --since 2019-07-15  --pretty=format:"%an %h %aD %s " --reverse |grep  -i  "xuan"|cut -d " " -f2| xargs -P 0 -n 1 -I {} git diff-tree --no-commit-id --name-only -r {}|sort|uniq
      #-P 0 注释:The -P switch should be turn off since it may impact performance.
      • git log [<options>] [<revision range>] [[--] <path>…]
        • options:
          • options applicable to the git rev-list command to control what is shown and how
          • options applicable to the git diff-* commands to control how the changes each commit introduces are shown.
        • -i(--regexp-ignore-case):Match the regular expression limiting patterns without regard to letter case.
        • -L <start>,<end>:<file>
          • -L :<funcname>:<file>
        • --branches[=<pattern>]
          • Pretend as if all the refs in refs/heads are listed on the command line as <commit>. If <pattern> is given, limit branches to ones matching given shell glob. If pattern lacks ?*, or [/* at the end is implied.
        • --since=<date>
          • --after=<date>
          • Show commits more recent than a specific date.
        • --pretty[=<format>]
          • --format=<format>
          • Pretty-print the contents of the commit logs in a given format, where <format> can be one of onelineshortmediumfullfulleremailrawformat:<string> and tformat:<string>. When <format> is none of the above, and has %placeholder in it, it acts as if --pretty=tformat:<format> were given.
          • See the "PRETTY FORMATS" section for some additional details for each format. When =<format> part is omitted, it defaults to medium.
          • Note: you can specify the default pretty format in the repository configuration (see git-config(1)).
        • --reverse
          • Output the commits chosen to be shown (see Commit Limiting section above) in reverse order. Cannot be combined with --walk-reflogs.
    • To get the commit number, add the following command to the previous pipe:

      • cut -d “ “ -f2
    • New files should get high priority. For modified files, you can just compare between the beginning of this week and the current snapshot.

  • It’ll be better if you can submit you report in .md format which is supported by Visual Code.
    • 用Visual Studio Code+ Markdown All in One插件修改。 关于md格式,请参考:基础mdbasic,高级mdextended

 

转载于:https://www.cnblogs.com/panpanwelcome/p/11264156.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值