====== git ====== Git is a code [[vcs|Version Control System]]. Useful resources: * [[https://ohshitgit.com/|"Oh shit, git!"]] * [[https://github.com/git-tips/tips|Git Tips]] on Github * [[tools|Tools for Developers]] * [[https://www.reddit.com/r/git/|/r/git]] ===== common tasks ===== ^ reset changes of specific file | ''%%git checkout -- filename%%'' | ^ undo all changes since last commit | ''%%git reset --hard%%'' | ^ merge multiple commits\\ ([[http://de.gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html|tutorial]]) | ''git rebase -i'' | ^ show remote repositories | ''git remote'' | ==== add file after commit ==== Sometimes you remember that you have to add a file to the commit you just made. If you want to add a file to your commit after you already committed the changes: git add git commit --amend This lets you edit the commit description after you committed the changes. If you don't want to change the commit message: ''%%git commit --amend --no-edit%%'' ===== Learn Git ===== * [[https://learngitbranching.js.org|Learn Git Branching]] – interactive visual Git tutorial. * [[https://git-scm.com/book/en/v2|Pro Git book]] (S. Chacon, B. Straub 2014. Apress) ===== set author ===== git config user.name "John Doe" git config user.email "john@doe.org" ===== foreign repositories ===== ==== just merge ==== # I want to make sure my master is in sync with the upstream master git checkout -b merge-patches master # first pull request git pull --no-ff https://github.com/user1/repo.git master # second pull request git pull --no-ff https://github.com/user2/repo.git branch1 ==== add as remote ==== git remote add upstream path/to/repository.git # get all refs and objects so your git knows what it can do git fetch --all You can merge foreign branches: git merge upstream/master ==== foreign Pull Requests from Github as refs ==== [remote "origin"] # add this line fetch = +refs/pull/*/head:refs/remotes/origin/pr/* then execute: # get refs git fetch --all # merge pull request with ID 999 git checkout pr/999 ([[https://gist.github.com/piscisaureus/3342247|Source]]) ===== push new branch ===== # change to branch to be added git checkout master # push it to the repo git push -u origin master ===== push into non-empty origin/master ===== //Error: [remote rejected] master -> master (branch is currently checked out)// # push to new branch on remote git push origin master:refs/heads/upload # on remote machine git merge upload git branch -d upload === Alternative: allow update of local branch === git config --local receive.denyCurrentBranch updateInstead ([[http://stackoverflow.com/questions/2816369/git-push-error-remote-rejected-master-master-branch-is-currently-checked|source]]) ==== merge two unrelated repositories ==== If you have two repositories which don't have a common origin, you can still merge them. If you try to do so via simple ''git pull'', you may get the error ''fatal: refusing to merge unrelated histories''. This is because git can't find a commit to base its merge on. git remote add some-old-repo https://github.com/user/some-old-repo.git git pull --allow-unrelated-histories some-old-repo master git status -s ([[https://www.alexkras.com/git-merg-two-or-more-repositories-and-keeping-history/|source]]) ===== manage dotfiles with git ===== echo "*" >> ~/.gitignore git add -f .gitignore ^ dotfile hinzufügen | ''git add -f .dotfile'' | === on the target peer === echo "*" >> ~/.gitignore ^ initialise | git init | ^ add remote | git remote add hostname:~ | ^ fetch files | git fetch --all | ^ replace existing | git reset --hard origin/master | ([[https://lrvick.net/blog/syncing_dotfiles_with_git/|Source]]) ===== Submodules ===== ^ get submodules when switched to branch with submodules | ''git submodule update'' | ===== Troubleshooting ===== ==== I copied a git repository from Linux/macOS to Windows and now it shows all files as changed! ==== Do a "git diff" on any file. What do you see? === The permissions have all changed! === git config core.filemode false === The whole file changed with weird ^ characters! === These are the line endings. Automatically adjust it to CRLF line endings with: git config --global core.autocrlf true ==== unable to migrate objects to permanent storage ==== Your permissions may be wrong. Check if any of the remote files in `.git` are not owned by the user you're connecting with. ([[https://stackoverflow.com/questions/65033831/unable-to-migrate-objects-to-permanent-storage|source]]) ==== git@github.com: Permission denied (publickey) ==== If you just want to clone a public repo with history from GitHub, don't use the ''git'' username like with ''%%git clone git@github.com:radicle-dev/radicle-upstream.git%%'', but rather the ''%%git://%%'' __protocol__: git clone git://github.com/radicle-dev/radicle-upstream.git ===== Secrets ===== Store passwords or other information you don't want to accidentally leak somewhere else than in your git repository. Use a secrets storage for this. You can use [[https://git-secret.io/|git-secret]], [[https://github.com/StackExchange/blackbox|blackbox]] or [[https://www.vaultproject.io/|Hashicorp Vault]] for this. ===== Articles ===== Some random articles about how to use Git in a regular or innovative way. * [[https://thenewstack.io/beyond-code-control-git-for-everything/|Beyond Code Control: Git for Everything]] (A. Schmunk, 2019) * [[https://medium.com/@dis_is_patrick/git-for-non-programmers-49c85d3f647d|Git for non-programmers]] (2014) * [[https://opensource.com/article/19/4/write-git|How writers can get work done better with Git]] (S. Kenlon. Opensource.com, 2019) ===== Videos ===== * [[https://www.youtube.com/watch?v=wpISo9TNjfU|Git vs. GitHub: What's the difference?]] (2020, Nathan Hekman, IBM Technology) ===== Tools ===== Useful programs to make life with Git easier or adding functionality to Git. * [[https://github.com/costerwi/rezip|ReZip]] – commit ZIP files to Git. *