---
title: Git Notes
h1: Git Notes
description: Git Notes.
author: JWRR
date: January 22, 2019
theme: a
...
[View markdown](git.md)
{{ toc }}

<a name="modify"></a>
## Modifying Files

You have a local, working repo and you''ve modify a file.  Now what?  It''s
time to **add** the change to the repo, **commit** the change(s) to the repo
and **push** the change to the remote **origin/master** repo.  The following
steps do this.

First run **git status** to see what has changed.

```
$ **git status**
On branch master
Your branch is up to date with 'origin/master'.
.
==Changes not staged for commit:==
  (use =="git add== <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
.
	modified:   lued_root/lued_bindings.lua
```

The `git status` command shows that a file has been modified.  Note that the
comment indicates the changes are **not staged for commit** and that we should
use `git add`.  Let''s follow the instructions for a change.

```
$ **git add lued_root/lued_bindings.lua**
$ **git status**
On branch master
Your branch is up to date with 'origin/master'.
.
==Changes to be committed:==
  (use "git reset HEAD <file>..." to unstage)
.
	modified:   lued_root/lued_bindings.lua
```

After running `git add` the changes are now ready **to be committed**. Let''s
run `git commit -m` to commit the change with a meaningful message.

```
$ **git commit -m "Change alt+B key binding to go to the bottom of file"**
[master 71208f2] Change alt+B key binding to go to the bottom of file
 1 file changed, 1 insertion(+), 1 deletion(-)
$ **git status**
On branch master
==Your branch is ahead of 'origin/master' by 1 commit.==
  (use =="git push"== to publish your local commits)
```

After running `git commit`, run `git status` again.  It says that *your branch
is ahead by 1 commit* and that you should run `git push`.  Again, let''s
following the directions.

```
$ **git push**
Username for 'https://github.com': *username*
Password for 'https://username@github.com': *password*
Counting objects: 4, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 409 bytes | 409.00 KiB/s, done.
Total 4 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), completed with 3 local objects.
To https://github.com/jwrr/lued.git
   0561c5c..71208f2  master -> master
.
$ **git status**
On branch master
Your branch is up to date with 'origin/master'.
```

The changes are now pushed up to the public repo and `git status` shows that
your local repo *is up to date*.


<a name="diff"></a>
## What''s the Diff
Sometimes I don''t remember what I changed. `git diff` will show the
difference between the modified file and the repo.

```
$ **git diff efefomatic.php**
diff --git a/efefomatic.php b/efefomatic.php
index 461a822..3bad5f0 100644
--- a/efefomatic.php
+++ b/efefomatic.php
-$efef_md[] = array( 'name' => 'mark',   'from' => "/\s==([^~]*?)==(?=[\p{P}\s])/s"   , 'to' => ' <mark>$1</mark>');
+$efef_md[] = array( 'name' => 'mark',   'from' => "/\s==([^=]*?)==(?=[\p{P}\s])/s"   , 'to' => ' <mark>$1</mark>');
 $efef_md[] = array( 'name' => 'u',      'from' => "/\s___([^_]*?)___(?=[\p{P}\s])/s" , 'to' => ' <u>$1</u>');
```

Sometimes I've already done `git add`, I''m about to write a meaningful
commit message, and I run `git diff` and it doesn't show the dfferences.

```
$ **git add efefomatic.php**
$ **git diff efefomatic.php**
```

To see the differences between the original repo and the staged files add
the **--staged** qualifier to `git diff --staged filename`.

```
$ **git diff --staged efefomatic.php**
diff --git a/efefomatic.php b/efefomatic.php
index 461a822..3bad5f0 100644
--- a/efefomatic.php
+++ b/efefomatic.php
@@ -108,12 +108,15 @@ $efef_md[] = array( 'name' => 'code',    'from' => "/`([^\n]+?)`/s" , 'to' => '<
-$efef_md[] = array( 'name' => 'mark',   'from' => "/\s==([^~]*?)==(?=[\p{P}\s])/s"   , 'to' => ' <mark>$1</mark>');
+$efef_md[] = array( 'name' => 'mark',   'from' => "/\s==([^=]*?)==(?=[\p{P}\s])/s"   , 'to' => ' <mark>$1</mark>');
```


<a name="fetch"></a>
## Git Fetch vs Git Pull

The `git fetch` and `git pull` commands are often confused, sound similar-ish,
and are usually used together in sequence. And to add to the confusion `git pull`
even has options that will run `git fetch`, although I don''t use or
recommend these options.  I prefer to use each command individually.

Most importantly, the `git fetch` command is harmless. It can be run at anytime.
It will not change, modify, delete or update any of the files in your local
repo.  I frequently run `git fetch` just out of habit.

It just fetches useful **meta-data** from the remote repo, which is
usually **origin/master** in my case.

Here is a simple test case.  First run `git status` and it indicates *Your
branch is up to date*.

```
$ **git status**
On branch master
Your branch is up to date with 'origin/master'.
```

But is it really? You know that commits from another remote repo were pushed
to **origin**.  Why doesn't `git status` indicate your repo is behind?
Because your local repo doesn't know it's behind. This is where `git fetch`
comes in.

```
$ **git fetch**
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 5 (delta 4), reused 5 (delta 4), pack-reused 0
Unpacking objects: 100% (5/5), done.
From https://github.com/jwrr/lued
   d7d8340..0561c5c  master     -> origin/master
```

It looks like `git fetch` did something.  Now re-run `git status`.

```
$ **git status**
On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)
```

Now `git status` correctly reports that *Your branch is behind by 1 commit*.
If you want to pull the changes from **origin** into to your local repo
use the `git pull` command.

In the following example let's pretend we know that the line containing **TT**
was changed and pushed to **origin/master**.  First use `grep` to show the
current value of the line.  Then run `git pull`.  It looks like it updated
some files, which is promising.  Now run `grep` again and... YES, the TT
line was changed to the new value.

```
$ **grep TT lued_root/lued_bindings.lua**
alt_TT        = ==tab_next==              hot("TT")
```

```
$ **git pull**
Updating d7d8340..0561c5c
Fast-forward
 README.md                   | 6 +++---
 lued_root/lued_bindings.lua | 4 ++--
 2 files changed, 5 insertions(+), 5 deletions(-)
```

```
$ **grep TT lued_root/lued_bindings.lua**
alt_TT        = ==tab_prev==              hot("TT")
```

Now re-run `git status` and it shows we're once again current with the
remote **master/origin** repo.

```
$ **git status**
On branch master
Your branch is up to date with 'origin/master'.
```

As shown, `git pull` changes your working repo, so only use it when you''re
ready for the changes.

<a name="log"></a>
## Re-Writing the Past

asdf

