Working with Git¶
Start working on a project¶
Start your own project¶
$ git init [PROJECT]creates a new, local git repository.
[PROJECT]if the project name is given, Git creates a new directory and initializes it.
If no project name is given, the current directory is initialised.
Tip
The default branch in Git is
master. However, as this term is offensive to some people, the default branch name can be configured in Git ≥ 2.28:$ git config --global init.defaultBranch main
Most Git hosts also use main as the standard for new repositories.
Work on a project¶
$ git clone SOURCEdownloads a project with all branches and the entire history from the remote repository, for example:
$ git clone https://github.com/cusyio/Python4DataScience.git
or
$ git clone git@github.com:cusyio/Python4DataScience.git
git clone --depthindicates the number of commits to be downloaded.
git clone -bspecifies the name of the remote branch to be downloaded.
Work on a project¶
$ git statusshows the status of the current branch in the working directory with new, changed and files already marked for commit.
git status -vshows the changes in the stage area as a diff.
git status -vvalso shows the changes in the working directory as a second diff.
See also
git status -s|--shortshows the status in short format, for example
$ git status -s M docs/productive/git/work.rst ?? Python4DataScience.txt
The preceding letters indicate the status of the file.
git statusgives a lot of advice on what to do with the files in the individual states:$ git status On branch main Your branch and 'origin/main' have diverged, and have 1 and 1 different commits each, respectively. (use "git pull" if you want to integrate the remote branch with yours) Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: docs/productive/git/work.rst Untracked files: (use "git add <file>..." to include in what will be committed) Python4DataScience.txt no changes added to commit (use "git add" and/or "git commit -a")
If you are familiar with Git, you may find these hints unnecessary. Then you can deactivate these messages with the
advice.statusHintsoption:$ git config --global advice.statusHints false
From now on, calling
git statuswill no longer display any hints:$ git status On branch main Your branch and 'origin/main' have diverged, and have 1 and 1 different commits each, respectively. Changes not staged for commit: modified: docs/productive/git/work.rst Untracked files: Python4DataScience.txt no changes added to commit (use "git add" and/or "git commit -a")
Also when calling
git-switchandgit-checkoutas well as when writing commit messages, no more hints are displayed.Tip
Although there are many other advice.* options, most of them are quite insignificant, so they should only be excluded when they start to interfere.
$ git add PATHadds one or more files to the stage area.
git add -padds parts of one or more files to the stage area.
git add -ethe changes to be adopted can be edited in the standard editor.
$ git diff [PATH]shows differences between working and stage areas, for example:
$ git diff docs/productive/git/work.rst diff --git a/docs/productive/git/work.rst b/docs/productive/git/work.rst index e2a5ea6..fd84434 100644 --- a/docs/productive/git/work.rst +++ b/docs/productive/git/work.rst @@ -46,7 +46,7 @@ :samp:`$ git diff {FILE}` - shows differences between work and stage areas. + shows differences between work and stage areas, for example:
By default, Git adds the prefixes
a/andb/in front of the file paths to the diff format.Tip
These prefixes are intended to mark the paths as * old* and * new* , but they prevent the file paths from being easily copied – some terminals also allow you to click on file paths to open them – but the prefixes prevent this. You can change this with a new function in Git 2.45:
$ git config --global diff.srcPrefix './' $ git config --global diff.dstPrefix './'
index e2a5ea6..fd84434 100644displays some internal Git metadata that you will probably never need. The numbers correspond to the hash identifiers of the git object versions.The rest of the output is a list of diff chunks whose header is enclosed in
@@symbols. Each chunk shows changes made in a file. In our example, 7 lines were extracted starting at line 46 and 7 lines were added starting at line 46.By default,
git diffperforms the comparison againstHEAD. If you usegit diff HEAD docs/productive/git/work.rstin the example above, it will have the same effect.git diffcan be passed Git references. BesidesHEAD, some other examples of references are tags and branch names, for examplegit diff MAIN..FEATURE_BRANCH. The dot operator in this example indicates that the diff input is the tips of the two branches. The same effect occurs if the dots are omitted and a space is used between the branches. In addition, there is a three-dot operator:git diff MAIN...FEATURE_BRANCH, which initiates a diff where the first input parameterMAINis changed so that the reference is the common ancestor ofMAINandFEATURE.Every commit in Git has a commit ID, which you can get by running
git log. You can then also pass this commit ID togit diff:$ git log --pretty=oneline af1a395a08221ffa83b46f562b6823cf044a108c (HEAD -> main, origin/main, origin/HEAD) :memo: Add some git diff examples d650de52306b63b93e92bba4f15be95eddfea425 :memo: Add „Debug .gitignore files“ to git docs … $ git diff af1a395a08221ffa83b46f562b6823cf044a108c d650de52306b63b93e92bba4f15be95eddfea425
git diff --staged,--cachedshows differences between the stage area and the repository.
git diff --word-diffshows the changed words.
$ git restore FILEchanges files in the working directory to a state previously known to Git. By default, Git checks out
HEAD, the last commit of the current branch.Note
In Git < 2.23,
git restoreis not yet available. In this case you still need to usegit checkout:$ git checkout FILE$ git commitmakes a new commit with the added changes.
git commit -m 'COMMIT MESSAGE'writes a commit message directly from the command line.
git commit --dry-run --shortshows what would be committed with the status in short format.
git commit -m 'FILE'passes file names or globbing patterns to
git committo commit changes to these files, skipping any changes that already exist in the staging area with git add.
$ git reset [--hard|--soft] [TARGET_REFERENCE]resets the history to an earlier commit.
$ git rm PATHremoves a file from the work and stage areas.
$ git stashmoves the current changes from the workspace to a stash.
To be able to distinguish your hidden changes as well as possible, the following two options are recommended:
You can also automatically apply stash for merge and rebase:
$ git config --global merge.autoStash true $ git config --global rebase.autoStash true
git stash -p|--patchallows you to partially hide changes, for example:
$ git stash -p diff --git a/docs/productive/git/work.rst b/docs/productive/git/work.rst index cff338e..1988ab2 100644 --- a/docs/productive/git/work.rst +++ b/docs/productive/git/work.rst @@ -83,7 +83,16 @@ ``list`` lists the hidden changes. ``show`` - shows the changes in the hidden files. + shows the changes in the hidden files, for example … (1/1) Stash this hunk [y,n,q,a,d,e,?]? y
With
?you get a complete list of options. The most common are:Command
Description
yHide this change
nDo not apply this change
qAll changes already selected will be hidden
aApply this and all subsequent changes
eEdit this change manually
?Help
Tip
Usually you have to press the ↩︎ key after every command with a letter. However, you can switch off this overhead:
$ git config --global interactive.singleKey true
git stash save MESSAGEadds a message to the changes.
git stash branch BRANCHNAMEcreates a branch from hidden files, for example:
$ git stash branch stash-example stash@{0} On branch stash-example Changes marked for commit: (use "git restore --staged <file>..." to remove from staging area). new file: docs/productive/git/work.rst Changes not marked for commit: (use "git add <file>..." to mark the changes for commit). (use "git restore <file>..." to discard the changes in the working directory) changed: docs/productive/git/index.rst stash@{0} (6565fdd1cc7dff9e0e6a575e3e20402e3881a82e) gelöscht
git stash save MESSAGEadds a message to the changes.
git stash -u UNTRACKED_FILEhides unversioned files.
git stash listlists the various stashes.
git stash list --date=relative|defaultalso displays the relative or absolute date.
git stash showshows the changes in the stashed files.
git stash poptransfers the changes from the stash to the workspace and empties the stash, for example:
$ git stash pop stash 2
git stash dropempties a specific stash, for example:
$ git stash drop stash 1 stash@{1} (defcf56541b74a1ccfc59bc0a821adf0b39eaaba) deleted
git stash cleardelete all your hiding places.