Git Xtended
Documentation

This is Git Xtended, a shell tool that makes it easy to perform recurring actions with Git on a daily basis.

Codacy

Codacy code quality

GitHub repo

https://github.com/jprivet-dev/git-xtended

1. Presentation

Git Xtended is a shell tool that makes it easy to perform recurring actions with Git on a daily basis.

gx c demo

It allows :

  • Display in the shell prompt the project status with Git information.

  • Set up documented Git & Bash aliases for recurring actions.

  • Have a commit message formatter (without prepare-commit-msg hook) inspired by the conventional commits.

  • Provide comprehensive and quickly accessible documentation in the shell.

  • Customise options globally or by project.

  • Ensure stability with unit tests.

Git Xtended does not alter the default operation of Git commands: all Git commands retain their original behaviour.

Some Git commands can have extended behaviour but only through aliases (e.g. $ git s: choose your files by their index instead of their path).

The features of Git Xtended are based on my experiments with hundreds of aliases, which you can find on my Gist Git and Bash aliases defined and documented in a single .bash_aliases file, with Git auto-completion.

2. Comments, suggestions?

Feel free to make comments/suggestions to me in the Git issues section.

3. Installation

3.1. In one command

$ cd && ([[ -d git-xtended ]] || (git clone --depth 1 --config core.autocrlf=false git@github.com:jprivet-dev/git-xtended.git && echo -e "\n# If the file gx.sh exists, then load it\n[ -f ~/git-xtended/gx.sh ] && . ~/git-xtended/gx.sh" >> ~/.bashrc)) && . ~/.bashrc && gx install

3.2. Manual installation

STEP #1: Clone the project

$ cd && git clone --depth 1 --config core.autocrlf=false git@github.com:jprivet-dev/git-xtended.git

STEP #2: Import gx.sh

Allow the loading of the ~/git-xtended/gx.sh in your file ~/.bashrc with the following command:

$ echo -e "\n# If the file gx.sh exists, then load it\n[ -f ~/git-xtended/gx.sh ] && . ~/git-xtended/gx.sh" >> ~/.bashrc

The command injects in the end of ~/.bashrc file the following lines:

~/.bashrc
# If the file `gx.sh` exists, then load it
[ -f ~/git-xtended/gx.sh ] && . ~/git-xtended/gx.sh

STEP #3: Reload ~/.bashrc

Or reload ~/.bash_profile (avoid logout and back to the shell).

$ . ~/.bashrc

You will see the status:

 _____ _ _      __ __ _             _       _
|   __|_| |_   |  |  | |_ ___ ___ _| |___ _| |
|  |  | |  _|  |-   -|  _| ._|   | . | ._| . |
\_____|_|_|    |__|__|_| |___|_|_|___|___|___/
                                              

----------------------------------------------
> Prompt with Git information        DISABLED 
> Git aliases                        DISABLED 
> Bash aliases                       DISABLED 
----------------------------------------------
> https://github.com/jprivet-dev/git-xtended <
----------------------------------------------

STEP #4: Activate the options you want

$ gx install

 Git Xtended install (Global configuration)


>  Prompt with Git information   [0] Disabled  [1] Enabled : 1
> Prompt with Git information = Enabled

>  Remote reference branch  [origin/main]:
> Remote reference branch = origin/main

>  Git aliases   [0] Disabled  [1] Enabled : 1
> Git aliases = Enabled

>  Bash aliases   [0] Disabled  [1] Enabled : 1
> Bash aliases = Enabled

>  Git autolink reference prefix  [#]:
> Git autolink reference prefix = #

After installation, you will see the status again:

 _____ _ _      __ __ _             _       _
|   __|_| |_   |  |  | |_ ___ ___ _| |___ _| |
|  |  | |  _|  |-   -|  _| ._|   | . | ._| . |
\_____|_|_|    |__|__|_| |___|_|_|___|___|___/
                                              

----------------------------------------------
> Prompt with Git information        ENABLED  
> Git aliases                        ENABLED  
> Bash aliases                       ENABLED  
----------------------------------------------
> https://github.com/jprivet-dev/git-xtended <
----------------------------------------------

3.3. Update Git Xtended

$ cd ~/git-xtended && git pull origin main && gx reload

4. Prompt with Git information

4.1. Username, Branch, Status, …​

Git Xtended changes the prompt (PS1) and adds information about Git:

12:00:00 user@host:~/path/project username(branch) 8≡ 1? 3! c(2 +1 -1) 3↓ 42↑ ⚠️️ 
$ gx prompt

  # Prompt with Git information :
    username(branch) ... Current Git username & branch
    8≡ ................. All elements from git status
    1? ................. Untracked files
    3! ................. Changes not staged for commit
    c(2 +1 -1) ......... Changes to be committed - c(modified added deleted)
    3↓ ................. Commits behind remote reference branch (origin/main)
    42↑ ................ Commits ahead remote reference branch (origin/main)
    ⚠️️  ................ To many commits behind or to many changes

4.2. Configure the « Remote reference branch »

To know if our current working branch is up to date, we need to compare it to the remote reference branch (the main branch for example). But for some projects, the remote reference branch might be different: staging, develop, …​

This is why Git Xtended allows you to configure a remote reference branch globally and per project:

$ gx remote-ref-branch
--------------------------------------------------
Remote reference branch
> global ... origin/main (current)
--------------------------------------------------

You can configure a remote reference branch per Git repository:

$ git config gx.remote-ref-branch origin/staging
$ gx remote-ref-branch
--------------------------------------------------
Remote reference branch
> local .... origin/staging (current)
> global ... origin/main
--------------------------------------------------
$ gx config
gx.prompt-status=Enabled
gx.gitaliases-status=Enabled
gx.remote-ref-branch=origin/main    (1)
gx.autolink-ref-prefix=#
gx.remote-ref-branch=origin/staging (2)
1 Global configuration.
2 Local configuration.

You can delete the local configuration:

$ git config --unset gx.remote-ref-branch

Troubleshooting (if the remote reference branch is not correct):

Sometimes, instead of having numbers (ex: 0↓ 42↑), you will see in the prompt x↓ x↑ in red:

12:00:00 user@host:~/path/project username(branch) x↓ x↑ ⚠️️ 
This means that the remote reference branch is not correct. Check that the remote branch of your repository is really existing.

5. GX Help

Show help with that following command:

$ gx
Command Result

$ gx

Show GX status ($ gx status), prompt information ($ gx prompt), all Git aliases ($ gx galiases) and GX commands ($ gx commands).

$ gx help

Same as $ gx.

$ gx status

Show GX status.

$ gx prompt

Show prompt information.

$ gx galiases

Show Git aliases.

$ gx baliases

Show Bash aliases.

$ gx commands

Show GX commands.

5.1. Prompt information

$ gx prompt

  # Prompt with Git information :
    username(branch) ... Current Git username & branch
    8≡ ................. All elements from git status
    1? ................. Untracked files
    3! ................. Changes not staged for commit
    c(2 +1 -1) ......... Changes to be committed - c(modified added deleted)
    3↓ ................. Commits behind remote reference branch (origin/main)
    42↑ ................ Commits ahead remote reference branch (origin/main)
    ⚠️️  ................ To many commits behind or to many changes

5.2. GX status

$ gx status

 _____ _ _      __ __ _             _       _
|   __|_| |_   |  |  | |_ ___ ___ _| |___ _| |
|  |  | |  _|  |-   -|  _| ._|   | . | ._| . |
\_____|_|_|    |__|__|_| |___|_|_|___|___|___/
                                              

----------------------------------------------
> Prompt with Git information        ENABLED  
> Git aliases                        ENABLED  
> Bash aliases                       ENABLED  
----------------------------------------------
> https://github.com/jprivet-dev/git-xtended <
----------------------------------------------

5.3. Git aliases

$ gx galiases

  # Git aliases :
             log | git l ........................... Show the last 12 commit logs (graphical representation)
                   git ll .......................... Show all commit logs (graphical representation)
                   git lfile <file> ................ Show all commit logs for a specific file (graphical representation)
                   git lmerges ..................... Show all merge logs (graphical representation)
                   git lcount ...................... Number of commits per author
          branch | git b ........................... Simple "branch" alias
                   git recent ...................... Show all local branches ordered by recent commits
                   git previous .................... Quickly switch to the previous branch
                   git new <branch> [<remote>/<b>] . Create and switch on new branch
                   git rename [<branch>] <name> .... Rename one local branch
                   git delete <branch> ............. Delete local branch
                   git deletef <branch> ............ Forcefully delete local branch
                   git deleter <remote> <branch> ... Delete remote branch
        checkout | git ck .......................... Simple "checkout" alias
                   git res [<i>|<path>] ............ Indexed "restore" command (select file with index status instead of path)
                   git sw .......................... Simple "switch" alias
          status | git s ........................... Indexed status list (staged, unstaged, and untracked files)
                   git ss .......................... Simple "status" alias
            diff | git d [<i>|<path>] .............. Indexed "diff" command (select file with index status instead of path)
                   git dd .......................... Simple "diff" alias
                   git dw [<path>] ................. Show changes (ignore whitespace / word diff / without [-...-]{+...+})
                   git ds [<path>] ................. Show changes staged for commit
                   git dsw [<path>] ................ Show changes staged for commit, like 'dw'
             add | git a [<i>|<path>] .............. Indexed "add" command (select file with index status instead of path)
                   git all ......................... Add all files (new, modified and deleted)
                   git nm .......................... Add new and modified files, without deleted
                   git md .......................... Add modified and deleted files, without new
          commit | git c [<i>|<path>|all] .......... Indexed "commit" command (select file with index status instead of path)
                   git amend ....................... Modify message of the previous commit
                   git noedit ...................... Modify previous commit without modifying the commit message
           reset | git r ........................... Simple "reset" alias
                   git hard [<commit>] ............. Simple "reset --hard" alias (by default, discard any changes to tracked files, since last commit)
                   git undo ........................ Undo the last commit, while keeping files changes
           clean | git untracked ................... Remove all untracked files
            push | git pushf [<remote> <branch>] ... Push force in safety mode
     cherry pick | git cp .......................... Simple "cherry-pick" alias
            tags | git tlast ....................... Show the most recent tag on the current branch
                   git tlist ....................... Display tags in natural order
          config | git confgx ...................... Show GX git configuration (as '$ gx config')
                   git unset ....................... Remove the line matching the key from config file (local)
                   git unsetall .................... Remove all lines matching the key from config file (local)
                   git edit ........................ Open an editor to modify the specified config file (local)
                   git unsetg ...................... Remove the line matching the key from config file (global)
                   git unsetallg ................... Remove all lines matching the key from config file (global)
                   git editg ....................... Opens an editor to modify the specified config file (global)
            grep | git find <string> ............... Look for specified strings in the tracked files (case sensitive)
    pull request | git pr [<base>] ................. Generate the url to compare and create a PR with the current branch
           stats | git contributors ................ Get the list of contributors for the current repository

5.4. Bash aliases

$ gx baliases

  # Bash aliases :
    g ................ Alias with Git autocompletion
    gti .............. Because it could happen to anyone ¯\_(ツ)_/¯
These Bash aliases take advantage of Git autocompletion.

5.5. GX commands

$ gx commands

  # GX commands :
    gx help ................ Display all help information about GX
    gx prompt .............. Display prompt information
    gx alias ............... Display all GX aliases
    gx commands ............ Display all GX commands
    gx install ............. Select and install GX elements
    gx reload .............. Reload GX
    gx status .............. Show status of GX elements
    gx config .............. Show GX git configuration
    gx remote-ref-branch ... Show remote reference branch (local & global)
    gx colors .............. Show all GX colors
    gx test [<func>] ....... Run one or all GX tests
    gx version ............. Show GX version

6. Some Git aliases explained

6.1. $ git s: choose your files by their index instead of their path

$ git s is an alias of $ git status and displays an indexed list of files:

$ git s
1)  M path/to/file-01.sh
2)  M path/to/file-02.sh
3)  M path/to/file-03.sh
4) ?? path/to/file-04.sh
5) ?? path/to/file-05.sh

Instead of specifying the path to the file you want, just specify it’s index:

$ git a 1 3
> git add (1) path/to/file-01.sh
> git add (3) path/to/file-03.sh
$ git s
1) M  path/to/file-01.sh
2)  M path/to/file-02.sh
3) M  path/to/file-03.sh
4) ?? path/to/file-04.sh
5) ?? path/to/file-05.sh

You can use the indexes with the following aliases:

Alias Original command More information

$ git a

$ git add

$ git c

$ git commit

$ git c: format your commits

$ git d

$ git diff

$ git d: show changes

$ git res

$ git restore

$ git s

$ git status

6.2. $ git c: format your commits

With $ git c, Git Xtended proposes a commit message formatting system (without prepare-commit-msg hook), inspired by the conventional commits:

Git Xtended does not prevent you from using the command $ git commit -m "my message" directly.
Command Result

$ git c

Add & Commit the first file in the status list. However, if you have already added files, there will be no default addition.

$ git c 1 3

Add & Commit the 1st and 3rd files in the status list.

$ git c src/app

Add & Commit all files in the src/app folder.

$ git c all

Add & Commit all files.

$ git c .

Add & Commit all files.

$ git c is an indexed version of $ git commit and allows files to be selected by their index. For more information, see $ git s: choose your files by their index instead of their path

STEP #1: You will have to choose a type (mandatory)

$ git c
> git add (1) README.adoc
> & commit ...
--------------------------------------------------
M  README.adoc
--------------------------------------------------
user.name  : user
user.email : user@email.com
--------------------------------------------------
MSG = <type*>(<scope*>): <subject*> (#<reference>)
--------------------------------------------------

<type*>
 build ...... Build system or external dependencies (Gulp, Broccoli, npm, ...)
 chore ...... Other changes that don't modify src or test files (.editorconfig, .gitignore, ...)
 ci ......... CI configuration files and scripts (Travis, Circle, BrowserStack, ...)
 conf ....... Configuration files (config/*.yaml, ...)
 docs ....... Documentation only changes (CHANGELOG, README, ...)
 feat ....... A new feature
 fix ........ A bug fix
 perf ....... A code change that improves performance
 refactor ... Refactoring or code-cleanup (no functional changes, no API changes)
 style ...... Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, ...)
 test ....... Adding missing tests or correcting existing tests

--------------------------------------------------
<type*> <<< | 
1 Type the corresponding shortcuts indicated in color and underlined in shell. For example (with ddocs()).
<type*> <<< [docs] | 
1 The last specified type is displayed in square brackets. Just press ENTER to reuse it.

STEP #2: You will have to choose the scope

docs(<scope*>) <<< | 
1 Indicate the scope (free writing).
docs(<scope*>) <<< [readme] | 
1 The last specified scope is displayed in square brackets. Just press ENTER to reuse it.

STEP #3: Then, indicate the subject

docs(readme): <subject*> <<< | 
1 Indicate the subject (free writing).

STEP #4: Indicate a reference (not mandatory)

docs(readme): update (#<reference>) <<< | 
1 Indicate the reference (free writing). You can leave this value blank.
docs(readme): update (#<reference>) <<< (#42)* | 
1 The last specified reference is displayed. Just press ENTER to reuse it and validate the commit. Type * and ENTER to delete the reference and validate the commit.

STEP #5: Writing the commit after the reference has been validated

--------------------------------------------------
docs(readme): update (#42)
--------------------------------------------------

[branch 286ae66] docs(readme): update (#42)
 1 file changed, 1 insertion(+), 1 deletion(-)
12:00:00 user@host:~/path/project username(branch) 0↓ 42↑
$

Go back

To go back during the commit, type only x and press ENTER:

docs(readme): update (#<reference>) <<< x|
docs(readme): <subject*> <<< x|
docs(<scope*>) <<< x|
<type*> <<< |

You can use in the commits autolinked references and URLs. As you can see when creating a commit on STEP #4: Indicate a reference (not mandatory), Git Xtended allows you to pre-format a reference : just specify 42, and the commit message formatting system will automatically add the prefix (by default #) to give the end (#42):

docs(readme): update (#42)

You can configure this prefix by project, for JIRA, Target Process, etc. For example for Target Process you can use TP:

$ git config gx.autolink-ref-prefix TP
$ gx config
gx.prompt-status=Enabled
gx.gitaliases-status=Enabled
gx.remote-ref-branch=origin/main
gx.autolink-ref-prefix=#   (1)
gx.autolink-ref-prefix=TP  (2)
1 Global configuration.
2 Local configuration.
docs(readme): update (TP<reference>) <<< 42|
docs(readme): update (TP42) (1)
1 For the reference, the prefix TP is used instead of #.

You can delete the local configuration:

$ git config --unset gx.autolink-ref-prefix

6.3. $ git d: show changes

$ git d is an indexed version of $ git diff and allows files to be selected by their index. For more information, see $ git s: choose your files by their index instead of their path

Command Result

$ git d

By default, show changes of the first file of $ git s list.

$ git d 3

Show changes of the third file of $ git s list (only one index can be selected at a time.).

$ git d src/app

Show changes of all files in src/app folder (behaviour identical to $ git diff).

$ git d 76ea756 8e74eb0

Show changes between commits (behaviour identical to $ git diff).

Changes visible automatically for staged files or not

$ git d is a slightly modified version of $ git diff : it has the same functionality as $ git diff, but when it needs to display differences, it is able to automatically differentiate between staged and not staged files.

In the following case, we have files staged and files not yet staged:

$ git s
1) M  path/to/file-01.sh
2)  M path/to/file-02.sh
3) MM path/to/file-03.sh
4) ?? path/to/file-04.sh
5) ?? path/to/file-05.sh

To see changes of file-01.sh and file-02.sh, we need to use the following commands :

$ git diff --staged path/to/file-01.sh  (1)
$ git diff path/to/file-02.sh           (2)
1 Changes between the index and your last commit; what you would be committing if you run git commit without -a option (--staged is a synonym of --cached). See Git - git-diff Documentation.
2 Changes in the working tree not yet staged for the next commit.

And for file-03.sh:

$ git diff --staged path/to/file-03.sh
$ git diff path/to/file-03.sh

With $ git d you can see changes of each files like this:

$ git d
--------------------------------------------------
> git diff (1) path/to/file-01.sh  STAGED VERSION  
--------------------------------------------------
diff --git a/path/to/file-01.sh b/path/to/file-01.sh
index 3cfee8f..8217141 100755
--- a/path/to/file-01.sh
+++ b/path/to/file-01.sh
...
... CHANGES
... CHANGES
... CHANGES
...
1 In this case, the file is identified as staged.
$ git d 2
--------------------------------------------------
> git diff (2) path/to/file-02.sh  NOT STAGED VERSION  
--------------------------------------------------
diff --git a/path/to/file-02.sh b/path/to/file-02.sh
index a110366..6caa810 100755
--- a/path/to/file-02.sh
+++ b/path/to/file-02.sh
...
... CHANGES
... CHANGES
... CHANGES
...
1 In this case, the file is identified as not staged.
$ git d 3
--------------------------------------------------
> git diff (3) path/to/file-03.sh  STAGED VERSION   
--------------------------------------------------
diff --git a/path/to/file-03.sh b/path/to/file-03.sh
index a1e9583..96cfcb4 100755
--- a/path/to/file-03.sh
+++ b/path/to/file-03.sh
...
... CHANGES
... CHANGES
... CHANGES
...
--------------------------------------------------
> git diff (3) path/to/file-03.sh  NOT STAGED VERSION   
--------------------------------------------------
diff --git a/path/to/file-03.sh b/path/to/file-03.sh
index 96cfcb4..833e464 100755
--- a/path/to/file-03.sh
+++ b/path/to/file-03.sh
...
... CHANGES
... CHANGES
... CHANGES
...
1 In this case, the file has two states : staged & not staged. $ git d displays the changes of both versions.

6.4. $ git pr: create a PR

$ git pr generates two URLs to compare and create a PR with the current branch. One URL with the main branch and one URL with the remote reference branch. All you have to do is click on the links:

$ git pr
> Compare & Create PR with current branch:
> https://github.com/jprivet-dev/git-xtended/compare/main...curren-branch    (1)
> https://github.com/jprivet-dev/git-xtended/compare/staging...curren-branch (2)
1 Compare with the main branch.
2 Compare with the remote reference branch. See Configure the « Remote reference branch ».

7. Override default settings (experimental)

For the moment this overload system is experimental. Work is still in progress :)

7.1. How does it work?

you can override all variables from parameter files params.xxx.sh in the folder ~/git-xtended/params/default/.

.
`-- ~/git-xtended/
    |-- doc/
    |-- params/
    |   |-- default/
    |   |   |-- params.colors.sh        |
    |   |   |-- params.default.sh       |
    |   |   |-- params.git.sh           | OVERLOADABLE
    |   |   |-- params.install.sh       | PARAMETERS
    |   |   |-- params.prompt.sh        |
    |   |   |-- params.sh               |
    |   |   `-- params.version.sh       |
    |   `-- test/
    |-- src/
    |-- tests/
    |-- .gitignore
    |-- gx.sh
    |-- gx.tests.sh
    |-- LICENSE
    `-- params.sh.dist

To do this, duplicate the following parameters file:

$ cp ~/git-xtended/params.sh.dist ~/git-xtended/params.sh

And copy in ~/git-xtended/params.sh the variables you want to change.

7.2. Customise your Git aliases labels

~/git-xtended/params.sh
GX_PARAMS_GIT_ALIAS_L="lg"        # instead of "l"
GX_PARAMS_GIT_ALIAS_UNTRACKED="u" # instead of "untracked"

To take into account its overloads, you will have to reload Git Xtended:

$ gx reload
$ gx
    Git aliases :
         log | git lg ................... Show the last 12 commit logs (graphical representation)
       clean | git u .................... Remove all untracked files

8. Code quality & Tests

8.1. Codacy & ShellCheck

Git Xtended is analyzed by Codacy.

Codacy is an automated code analysis/quality tool that helps developers ship better software, faster. Codacy uses ShellCheck, a GPLv3 tool that gives warnings and suggestions for bash/sh shell scripts.

8.2. Functional & Unit tests

Git Xtended uses an internal system of functional and unit tests to verify the stability of developments.

.
`-- ~/git-xtended/
    |-- doc/
    |-- params/
    |-- src/
    |-- tests/
    |   |-- colors.tests.sh         |
    |   |-- commands.tests.sh       |
    |   |-- git.tests.sh            | FUNCTIONAL AND
    |   |-- prompt.tests.sh         | UNIT TESTS
    |   |-- test.tests.sh           |
    |   `-- utils.tests.sh          |
    |-- .gitignore
    |-- gx.sh
    |-- gx.tests.sh
    |-- LICENSE
    `-- params.sh.dist

Run the tests with $ gx test:

$ gx test

 Git Xtended testing

>  Would you like to run the tests ? [y/n] y

> Tests launched

--- Functions with test ---

[x]  gx_colors_print_all
[ ]  gx_command_action_aliases
[ ]  gx_command_action_colors
...
...
...
[ ]  gx_remove_r
[ ]  gx_symlink_exists
[x]  gx_trim

TOTAL: 66/142 - 46%

--- Launch all tests ---

# test_gx_colors_print_all +
# test_gx_command_help +++
# test_gx_command_help_command_line +++
...
...
...
# test_gx_regex_remove_colors ++++++++++++++++
# test_gx_test_fake_git ++
# test_gx_trim ++++++++

 OK: 67 tests, 242 assertions, 0 failure 

9. Resources & Inspiration

  1. http://reinh.com/blog/2009/03/02/a-git-workflow-for-agile-teams.html

  2. http://www.jarrodspillers.com/git/2009/08/19/git-merge-vs-git-rebase-avoiding-rebase-hell.html

  3. https://bitbucket.org/durdn/cfg/src/master/.gitconfig?fileviewer=file-view-default

  4. https://developer.atlassian.com/blog/2015/10/monorepos-in-git/

  5. https://explainshell.com

  6. https://fr.atlassian.com/git/tutorials/rewriting-history

  7. https://gist.github.com/aemonge/9e60332c6a3e7147ee8e

  8. https://gist.github.com/stephenparish/9941e89d80e2bc58a153

  9. https://git-scm.com

  10. https://git-scm.com/book/en/v2/Git-Branching-Rebasing

  11. https://git-scm.com/book/fr/v1/Git-distribu%C3%A9-Contribution-%C3%A0-un-projet

  12. https://github.com/ahmadawais/hacktoberfest

  13. https://github.com/alebcay/awesome-shell

  14. https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md

  15. https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines

  16. https://github.com/nojhan/liquidprompt

  17. https://jondavidjohn.com/git-aliases-parameters/

  18. https://nvie.com/posts/a-successful-git-branching-model/

  19. https://raw.githubusercontent.com/arslanbilal/git-cheat-sheet/master/Img/git-flow-commands-without-flow.png

  20. https://stackoverflow.com/questions/20433867/git-ahead-behind-info-between-master-and-branch

  21. https://stackoverflow.com/questions/3258243/check-if-pull-needed-in-git

  22. https://stackoverflow.com/questions/572549/difference-between-git-add-a-and-git-add

  23. https://www.atlassian.com/agile/software-development/git-branching-video

  24. https://www.atlassian.com/blog/git/advanced-git-aliases

  25. https://www.atlassian.com/blog/git/git-automatic-merges-with-server-side-hooks-for-the-win

  26. https://www.conventionalcommits.org/en/v1.0.0/

10. License

Git Xtended is released under the MIT License