git stash list -S "the thing" -p
John Wiegley has a ton of useful git scripts which he's collected from around the net: https://github.com/jwiegley/git-scripts
https://samuelgruetter.net/blog/2018/08/31/git-ffwd-without-checkout/ has a really nice post about branch fast forwarding and fetching, and some detail on what's going on when you do something like:
git fetch origin master:master
And even more interestingly:
git fetch . feature:master
where you're fetching from your local repo .
and pushing from your feature
branch to your master
branch.
git remote prune origin && git remote rm origin
Sometimes when you want to checkout a branch, even though your current branch is clean, you'll get a failed partial checkout, because a file in your current branch will be changed by the new branch (Looking at you .xcodeproj
files). As long as you know your current branch is clean and up-to-date, -f
force the checkout
git checkout -f the_branch
git fetch origin
git reset --hard origin/master
git checkout HEAD -- some/folder/or/file/path
git checkout @{yesterday}
git checkout @{1.week.ago}
git checkout @{2.months.ago}
git checkout @{"2019-04-26"}
Via https://twitter.com/jaygooby/status/996308522680897537 - loads more git date usages here: https://alexpeattie.com/blog/working-with-dates-in-git
git stash save --keep-index
You should take a look at http://ohshitgit.com/ :)
To view, but not checkout a file, use a commit-ish object like a commit sha, short sha, head or stash identifier
git show 250022c63fab80030dcbc72e8b4bf5aa683d8633:file.txt
git show 250022c63:file.txt
git show stash@{2}:file.txt
Great for when you're ready to push your local branch with loads of tiny commits to a public repo, or you want to issue a pull request without all your legacy commits. I didn't want to rebase and squash interactively, because I knew in this case that I wanted a single clean commit to start a new public repository with.
git reset $(git commit-tree HEAD^{tree} -m "A new start")
Found at https://stackoverflow.com/a/23486788/391826 - it's the One Liner solution.
This will push all branches on remote-x to remote-y without you needing to have local copies
git push remote-y refs/remotes/remote-x/*:refs/heads/*
You'll need to do the same for tags:
git push remote-y refs/tags/*:refs/tags/*
Thanks to https://stackoverflow.com/a/21133502/391826
If you've added a new remote, you might want to push all your branches to it:
git push new-remote --all
Maybe you want to cherry-pick from a different branch and you need to know the commit hash:
git log different-branch
You can also look at the log for a specific file on that branch:
git log different-branch path/to/file
git difftool -y -x "diff --suppress-common-lines -y -W 225" master 0ce112bd6dcbedd128566ce712d8cb5d98d765ae |less
-x
to execute the diff command, -y
for side-by-side, -W
for width of lines
git branch --contains 90be408084cc37b3bcc67eaf0b406ca4f1f381fd
Thanks http://stackoverflow.com/a/1419637/391826
git log --first-parent --no-merges HEAD
You just need to checkout the branch you want, e.g.
git checkout master
git for-each-ref --count=30 --sort=-committerdate refs/heads/ --format='%(refname:short)'
and if you want the most recently changed remote branches, swap refs/heads
for refs/remotes
. Both these via Stackoverflow.
git for-each-ref --count=30 --sort=-committerdate refs/remotes/ --format='%(refname:short)'
git stash list -p | grep -i foo
git log --all -S"foo" -p
(You can't use this with git difftool or merge though)
git diff --ignore-space-at-eol
Got a conflict during a merge? Know that you only care about the file in the other branch?
git checkout --theirs file/that/has/conflict
Know that yours is the correct one?
git checkout --ours file/that/has/conflict
Want to merge but know that you want your files to win any conflicts?
git merge -s recursive -X ours
git commit --amend -m "New commit message"
git add forgotten_file other_forgotten_file ...
git commit --amend
git stash save "Nearly finished the blah feature, but have to fix yak first"
git stash show stash@{1}
git diff some_branch:spec/blueprints.rb stash@{1}:spec/blueprints.rb
# git difftool stash@{1}
# would diff the whole current branch against the stash,
# you probably just want the diffs of the files in the stash
for file in `git stash show --name-only stash@{1}`; do git difftool your_branch:$file stash@{1}:$file; done
git checkout stash@{1} -- path/of/file/in/stash.rb
# note, can also pass multiple files to get them all at once
# git checkout stash@{1} -- path/of/file/in/stash.rb path/to/file2.txt path/to/another/file.jpg
# When you diff you can look at the files committed in HEAD, versus those on disk
#
# on disk:
git diff stash@{0}:spec/blueprints.rb spec/blueprints.rb
# in HEAD:
git diff stash@{0}:spec/blueprints.rb HEAD:spec/blueprints.rb
# staged:
git diff stash@{0} -- spec/blueprints.rb
# this omission of the filename and the separation with -- from the stash works with the other examples too
# You're working in feature/my-branch and you want to merge from master
#
# git fetch origin master
# git difftool feature/my-branch...origin/master
#
# Note the three ...
# Without them you're comparing? which is a different thing entirely
# if it's all looking good, then git merge origin master