git fetch git log --name-status origin/master.. Will show you what commits you are about to retrieve, along with the names of the files. Based upon this reply the command "git log --graph -p" is doing a nice job. It shows tree information about the history and code changes as well.
The reason for error messages like these is rather simple: you have local changes that would be overwritten by the incoming new changes that a "git pull" would bring in. For obvious safety reasons, Git will never simply overwrite your changes.
How it works: git fetch downloads the latest from remote without trying to merge or rebase anything. Then the git reset resets the master branch to what you just fetched. The --hard option changes all the files in your working tree to match the files in origin/master .
You're in luck! You can just git pull . The files affected by your local work have ZERO overlap with the files affected by the changes you need to pull from the remote.
Suppose you're pulling to master. You can refer to the previous position of master
by master@{1}
(or even master@{10.minutes.ago}
; see the specifying revisions section of the git-rev-parse man page), so that you can do things like
See all of the changes: git diff master@{1} master
See the changes to a given file: git diff master@{1} master <file>
See all the changes within a given directory: git diff master@{1} master <dir>
See the summary of changes again: git diff --stat master@{1} master
As for your question of "how do I know if I'm on master"... well, using branches is an important part of the Git workflow. You should always be aware of what branch you're on - if you pulled changes, you want to pull them to the right branch! You can see a list of all branches, with an asterisk by the currently checked-out one, with the command git branch
. The current branch name is also printed along with the output of git status
. I highly recommend skimming the man pages of commands to use - it's a great way to slowly pick up some knowledge.
And your last question: HEAD
is the name for the currently checked out branch. You can indeed use HEAD
and HEAD@{1}
in this context as well, but it's a bit more robust to use the branches, since if you go and check out another branch. HEAD
is now that second branch, and HEAD@{1}
is now master
- not what you want!
To save having to ask a lot of little questions like this, you should probably have a look at a Git tutorial. There are a million on the web, for example:
Say you do a git pull like this:
$ git pull
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 6 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From [email protected]:reponame
a407564..9f52bed branchname -> origin/branchname
Updating a407564..9f52bed
Fast forward
.../folder/filename | 209 ++++++++-----
.../folder2/filename2 | 120 +++++++++++---------
2 files changed, 210 insertions(+), 119 deletions(-)
You can see the diff of what changed by using the revision numbers:
$ git diff a407564..9f52bed
1. How do I know if I was pulling to master? All I did is "git pull".
The command itself works like this:
git pull [options] [<repository> [<refspec>…]]
and per default refers to the current branch. You can check your branches by using
git branch -a
This will list your local and remote branches like for e.g so (Added a ---
as divider between local and remote to make it more clear)
*master
foo
bar
baz
---
origin/HEAD -> origin/master
origin/deploy
origin/foo
origin/master
origin/bar
remote2/foo
remote2/baz
When you then take a look at one remote repo, you will see what you are referring to:
git remote show origin
will list like the following:
* remote origin
Fetch URL: ssh://[email protected]:12345/username/somerepo.git
Push URL: ssh://[email protected]:12345/username/somerepo.git
HEAD branch: master
Remote branches:
foo tracked
master tracked
Local refs configured for 'git push':
foo pushes to foo (up to date)
master pushes to master (fast-forwardable)
So it's quite easy to be sure where to pull from and push to.
3. how to see the detail change in a specific file?
4. how to see the change in summary output by last git pull again?
The easiest and most elegant way (imo) is:
git diff --stat master@{1}..master --dirstat=cumulative,files
This will give you two blocks of information about the changes in between your last pull an the current state of work. Example output (I added a ---
as divider between --stat
and --dirstat
output to make it more clear):
mu-plugins/media_att_count.php | 0
mu-plugins/phpinfo.php | 0
mu-plugins/template_debug.php | 0
themes/dev/archive.php | 0
themes/dev/category.php | 42 ++++++++++++++++++
.../page_templates/foo_template.php | 0
themes/dev/style.css | 0
themes/dev/tag.php | 44 +++++++++++++++++++
themes/dev/taxonomy-post_format.php | 41 +++++++++++++++++
themes/dev/template_parts/bar_template.php | 0
themes/someproject/template_wrappers/loop_foo.php | 51 ++++++++++++++++++++++
---
11 files changed, 178 insertions(+)
71.3% themes/dev/
28.6% themes/someproject/template_wrappers/
100.0% themes/
27.2% mu-plugins/
9.0% themes/dev/page_templates/
9.0% themes/dev/template_parts/
63.6% themes/dev/
9.0% themes/someproject/template_wrappers/
72.7% themes/
This way's kind of hacky, but it'll allow you to use graphical tools like gitk
or gitg
or git-gui
:
git pull
git reset HEAD@{1}
gitg (or gitk or whatever tool you like)
The answer with the most upvotes gives the best way using the git tool, but I use this method because I can then utilize tools with GUI to see the changes :P
I'd then have the extra step of doing a git checkout .
and then doing git pull
again so that I properly pull and merge, but I value the ability to examine differences in a GUI enough to deal with the extra two steps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With