Open main menu

Changes

908 bytes added ,  14:29, 17 March 2021
Add section to show a branches parent
== Search ==
<code>git grep</code> only works on the current content of your working copy. To search through all revisions, you can use something like
<source lang="bash">
</source>
== Ignore File Mode ==
Sometimes you have to temporarily change file modes (or some script might alter your working directory). Anyway, to ignore file mode changes temporarily, you can just add <code>-c core.fileMode=false</code> to your command. E.g.:
<source lang="bash">
</source>
== Working on a remote terminal ==
If you're working on a remote terminal and your repository get's complicated, but you don't have desktop tools like [[meld]] or [[gitk]] to look at it, you can copy the remote repo to your desktop with <code>rsync</code>, even if you have to jump through a bastion host with something like:
If that complains about host-key verification, then simply do an SSH first to the host, accept the host key identity, and logout. Now the rsync will work because the host-key is already accepted as valid.
== Tracking remote branches ==
Checkout a specific branch from origin, and track it.
What if you enter <code>git checkout -b REL1_29</code> when you *should have entered* <code>git checkout -b REL1_29 origin/REL1_29</code>? J<s>ust tell git that you meant to track the branch in origin: <code>git branch --set-upstream-to=origin/REL1_29 REL1_29</code></s> Set upstream doesn't do what's intended here! You should delete the branch that you created as a 'copy'; and then checkout the branch correctly. To checkout the branch correctly, just IGNORE the <code>-b</code> flag altogether. If you ''do'' use the <code>-b</code> flag, then you ''must'' use the long form that references the remote branch to track. If you just do a '<code>git checkout foo</code>' and there exists the same branch upstream at <code>origin/foo</code> then git will checkout a new branch set to track the remote.
== Tracing in Status ==
Add <code>GIT_TRACE=1</code> to your command to see more of what's going on. (Note that there are no spaces and no semicolon.)
</source>
== Just the facts ==
Want simple red/green diff lines?
</source>
== What is this miscellaneous file, and how does it compare to what's in my repo? ==
Say you've got a config file lying around (untracked) in your local working tree. It's not in your current project branch, but you know it's an important file. How does it compare to what's in the '''freephile''' remote, '''es128''' branch version of the file?
</source>
== How has this file changed over time? ==
While you can use gitk on your desktop, if you're on a headless server, you can ask <code>git log</code> to show you the '''patch''' for each commit: <code>git log -p path/to/file</code>
== Compare a file between branches ==
Do you think a particular file has changed between two separate feature branches (ea based off master)?
</source>
== Add that forgotten file ==
You forgot to add a file to the last commit? Just add it to the index, and commit with <code>--amend</code>. Added a file that shouldn't be there? <code>git rm</code> it. If you leave off the -m (message) option in the new commit, it will let you re-use the last commit message. This lets you "undo the last commit" and redo it right. You usually do not want to amend a commit if you've already pushed it to other repos, but if it's just local <code>--amend</code> is awesome-sauce.
</source>
== Undo a commit ==
Sometimes a commit is just wrong or 'breaks the build' so to speak. If you really just want to '''undo''' a commit, then
Credit: there's a clear explanation at https://www.git-tower.com/learn/git/faq/undo-last-commit
== Git Branch ==
* list the branches you have locally <code>git branch --list</code>* list the branches that are on remotes <code>git branch -r --list</code>* checkout a remote branch, setting the local one to track <code>git checkout -t freephile/patch-1</code>* git branch --merged (while on master) shows you branches which are fully contained in HEAD, and can be deleted.
== Comparing local to upstream ==
If you do a <code>git status</code> and it tells you that your (local) branch is behind the remote tracking branch, then maybe you want to look at what those changes are.
<code>git diff FETCH_HEAD -- mydir/myfile.js</code>
== Comparing Branches ==
What's in this old branch, not in my new branch (ignoring merges)?
* git log oldbranch ^newbranch --no-merges
* git log master..feature (everything on the feature branch that is not in master)
* git log HEAD..freephile/master (everything in the remote 'freephile/master' that's not in HEAD locally)
* git log origin/master..HEAD (everything in the local branch that you would push)
* git log --left-right master...experiment (triple dot shows everything since the common ancestor) <ref>https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges</ref>
*git log oldbranch ^newbranch --no-merges
*git log master..feature (everything on the feature branch that is not in master)
*git log HEAD..freephile/master (everything in the remote 'freephile/master' that's not in HEAD locally)
*git log origin/master..HEAD (everything in the local branch that you would push)
*git log --left-right master...experiment (triple dot shows everything since the common ancestor) <ref>https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges</ref>
<br /> == How did I get here? ==What branch did this branch originate from? Or more precisely, what's the nearest ancestor commit on a separate branch?<syntaxhighlight lang="bash" line="1">branch=`git rev-parse --abbrev-ref HEAD` \git show-branch -a 2>/dev/null \| grep '\*' \| grep -v "$branch" \| head -n1 \| sed 's/.*\[\(.*\)\].*/\1/' \| sed 's/[\^~].*//'</syntaxhighlight>Explanation: # Grab the name of the current branch.# Show all commits (with errors or warnings going to dev null).# Ancestors of the current commit are indicated by a star. Filter out everything else.# Ignore all the commits in the current branch.# The first commit remaining is the nearest ancestor from another branch.# Branch names are displayed [in brackets]. Ignore the brackets and everything else.# Sometimes the branch name will include a ~2 or ^1 to indicate how many commits are between the referenced commit and the branch tip. We don't care. Ignore them. == Don't merge, Rebase! ==
Get familiar with how to rebase your work each day http://www.bitsnbites.eu/a-tidy-linear-git-history/
If you forget to pull before you commit some local changes, you might just be able to `git rebase` to pull and re-play your changes on top of the branch.
== Delete local and remote merged branches ==
<source lang="bash">
Using '''echo''' helps you look before you leap. '''%''' is the replacement string in <code>xargs</code>. Change '<code>echo</code>' to '<code>sh -c</code>' to execute. Does both local and remote prunes.
== Git Log ==
What's the commit history? The [https://git-scm.com/docs/git-log man page for git log] is so big, it's a forest. There are examples in the book for [https://git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-History viewing commit history]. For a quick cheatsheet, try these.
</source>
== Tags ==
With git, you can just tag something with <code>git tag foo</code>. This produces a 'lightweight' tag <ref>[https://stackoverflow.com/questions/21031201/how-can-i-list-all-lightweight-tags how can I list all the lightweight tags]</ref>. Use "annotated tags" whenever you want to know '''when''' something was tagged and '''who''' did it. Pass an empty message if you really don't care or need extra annotation.
== [https://stackoverflow.com/questions/12921125/git-merge-branch-of-another-remote Git merge branch of another remote] ==
When using git between a local repository and a single 'origin' remote, it's a simple process to work locally and push things back up to origin. But, what if you have a separate remote repository... perhaps on GitHub, or a collaborator who has similar sources but not using your origin (so disconnected, and perhaps not even linked ancestrally like a fork). How do you add that other remote to your project and then pull in the code "they" have on top of yours? Here's an example of how we started with a repo from github and added a repo that we were developing privately. (The reality is that we were developing a repo privately; created a sibling version of the code at github; and then wanted to re-incorporate the changes of the github repo back into our private repo.)
</source>
== Unbloat ==
https://stackoverflow.com/questions/3797907/how-to-remove-unused-objects-from-a-git-repository
</source>
== Put your project on GitHub ==
Been hacking away on a project and now it's time to unveil it? Here are the quick and easy steps to get your local repo into your GitHub account.
</source>
== Create a README from a webpage ==
Now create a fine README file using [[pandoc]] to convert your webpage to [[Markdown]]
</source>
== Remember your password ==
I know how to configure my user and email, but how do I tell git to remember my password for repos that I'm interacting with?
The answer is credential helper