How not to be a Git Tips and tricks for a good workflow Who am I? - - PowerPoint PPT Presentation

how not to be a git
SMART_READER_LITE
LIVE PREVIEW

How not to be a Git Tips and tricks for a good workflow Who am I? - - PowerPoint PPT Presentation

How not to be a Git Tips and tricks for a good workflow Who am I? Adam Jimerson System Architect @ Utiliflex PacBSD Developer vendion@gmail.com https://google.com/+A damJimerson https://vendion.me What is a


slide-1
SLIDE 1

How not to be a Git

Tips and tricks for a good workflow

slide-2
SLIDE 2

Who am I?

  • Adam Jimerson
  • System Architect @

Utiliflex

  • PacBSD Developer
  • vendion@gmail.com
  • https://google.com/+A

damJimerson

  • https://vendion.me
slide-3
SLIDE 3

What is a Git?

1. A distributed revision control and source code management (SCM) system with an emphasis on speed, data integrity, and support for distributed, non-linear workflows. 2. A mild profanity with origins in British English for a silly, incompetent, stupid, annoying, senile, elderly or childish person.

slide-4
SLIDE 4

Still lost?

  • Code School + Github’s ‘Try Git’ (interactive)
slide-5
SLIDE 5

Microsoft + GitHub

slide-6
SLIDE 6

Still lost?

  • Code School + Github’s ‘Try Git’ (interactive)
  • Bitbucket Git Tutorials
  • Pro Git Book or Online version (more recent)
slide-7
SLIDE 7

Let’s start with tips

slide-8
SLIDE 8

Listing tracked files

List all tracked files $ git ls-files List all tracked files in a given branch $ git ls-tree -r <branch> --name-only

slide-9
SLIDE 9

Ignoring tracked files

First we need to remove the file from Git $ git rm --cached <filename> Then add the file to the ignore file $ echo ‘filename’ >> $projectRoot/.gitignore

slide-10
SLIDE 10

Ignoring tracked files

$ git update-index --assume-unchanged <filename> To tell git to ignore changes to a file, but not delete it, run:

slide-11
SLIDE 11

Ignoring files

Use Global Gitignore files $ git config --global core.excludesfile ~/.gitignore_global Good starter: https://gist.github.com/octocat/9257657 Gitignore templates: https://www.gitignore.io/

slide-12
SLIDE 12

Ignoring files for a repo

Add the file(s) name to .git/info/exclude NOTE: This only affects that repository, and should only be used for files you don’t want in the repos ignore file.

slide-13
SLIDE 13

Always name remotes

When doing pushes or pulls always name the remote server and branch. $ git pull <remote> <branch> $ git push <remote> <branch>

slide-14
SLIDE 14

But that is hard!

  • That is extra typing that I have to do!
  • I only ever work with one remote/branch anyways!
  • etc...
slide-15
SLIDE 15

Solution

function current_branch() { ref=$(git symbolic-ref HEAD 2> /dev/null) || \ ref=$(git rev-parse --short HEAD 2> /dev/null) || return echo ${ref#refs/heads/} } # these aliases take advantage of the previous function alias ggpull='git pull origin $(current_branch)' alias ggpur='git pull --rebase origin $(current_branch)' alias ggpush='git push origin $(current_branch)'

slide-16
SLIDE 16

Autocorrect

$ git plush origin master git: 'plush' is not a git-command. See 'git --help'. Did you mean this? push

slide-17
SLIDE 17

To have Git fix this

$ git config --global help.autocorrect = 1

slide-18
SLIDE 18

Removing whitespace

Create a $HOME/.config/git/attributes file and add: * filter=trimWhitespace

slide-19
SLIDE 19

Removing whitespace

Next we need to tell Git about this filter $ git config --global filter.trimWhitespace.clean trim_whitespace

slide-20
SLIDE 20

Removing whitespace

Now create the “trim_whitespace” command #!/usr/bin/env ruby lines = STDIN.readlines lines.each do |line| puts line.rstrip end

slide-21
SLIDE 21

Prettier log output

Add the following to $~/.gitconfig under the [alias] section lg = log --color --graph \ --pretty=format:'%Cred%h%Creset

  • %C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'
  • -abbrev-commit --
slide-22
SLIDE 22

What does that do

* aba0786 - (HEAD -> master, origin/master, origin/HEAD) correctly target flexbox from view (46 minutes ago) <Lee Walker> * 86c5c99 - Updated ...block--field-social-source.tpl.php (19 hours ago) <Adam Jimerson>

slide-23
SLIDE 23

Another log

alias glogf='git log --graph --color'

slide-24
SLIDE 24

What does that do?

* commit 437a491f99f30e14ecb63af6f07e540af3fd9e00 |\ Merge: 770a155 defc9bd | | Author: John Smith <jsmith@example.com> | | Date: Thu Aug 13 16:15:22 2015 -0400 | | | | Merge branch 'master' of ssh://codeserver.dev.6ad151bf-f855-4e85-b698-52983a55a 2d2.drush.in:2222/~/repository

slide-25
SLIDE 25

Diffing for Humans

Diff-So-Fancy: https://github.com/so-fancy/diff-so-fancy $ git diff --color | diff-so-fancy OR $ git config --global interactive.diffFilter = ‘diff-so-fancy’ (Requires Git 2.[6,7,8])

slide-26
SLIDE 26

What it looks like

slide-27
SLIDE 27

Handling multiple emails

  • What if you have repos you need associated with different email

addresses?

  • Edit .git/config file for each repository manually
  • Create a Git command to set email addresses for you.
slide-28
SLIDE 28

Profile command

In the global Git config file add the following under the [alias] tag workprofile = config user.email \"adam@codejourneymen.com\" Then run $ git workprofile

slide-29
SLIDE 29

Speed up slow net

If you have problems with slow network connections. Edit ~/.ssh/config add: ControlMaster auto ControlPath /tmp/%r@%h:%p ControlPersist yes

slide-30
SLIDE 30

Stop working around Git

Git implements several commands that interact with the filesystem as well as its own tracking info.

  • mv => git mv
  • rm => git rm
slide-31
SLIDE 31

Moving files

$ git mv <oldFilename> <newFilename> is the same as $ mv <oldFilename> <newFilename> $ git add <newFilename>

slide-32
SLIDE 32

Removing files

$ git rm <filename> is the same as $ rm <filename> $ git rm <filename>

slide-33
SLIDE 33

Recovering/Restoring Files

Discarding changes $ git checkout <file> Rolling a file back $ git checkout master~N <file> Working on all files with a certain extension $ git checkout -- ‘*.php’

slide-34
SLIDE 34

Copying files from one branch to another

To copy files or directories from one branch to the current branch $ git checkout <branch> -- <file>

slide-35
SLIDE 35

And now for something completely different...

slide-36
SLIDE 36

Branching

  • How to work with

branches.

  • Why you should work

with branches.

slide-37
SLIDE 37

What is a branch anyways?

A branch is a copy

  • f the code base, where

changes can be made that doesn’t affect copies. *Very simple explanation

slide-38
SLIDE 38

Listing branches

Using the branch command with no arguments displays a list of branches and marks the current branch $ git branch develop *master

slide-39
SLIDE 39

Creating branches

Create a new branch by giving a single argument to branch $ git branch <name>

slide-40
SLIDE 40

Switching branches

To switch branches give the name of the branch as an argument to checkout $ git checkout <branch_name>

slide-41
SLIDE 41

Doing both at once

To create and switch to the branch $ git checkout -b <name>

slide-42
SLIDE 42

Deleting a branch

To delete a branch after it has been merged $ git branch -d <name> To delete a branch without merging $ git branch -D <name>

slide-43
SLIDE 43

Recovering deleted branch

$ git reflog

793d399 HEAD@{0}: rebase finished: returning to refs/heads/develop 793d399 HEAD@{1}: rebase: checkout feature/test2 2d1a343 HEAD@{2}: checkout: moving from feature/test2 to develop 793d399 HEAD@{3}: checkout: moving from feature/test1 to feature/test2

$ git checkout -b <branch> HEAD@{N}

slide-44
SLIDE 44

Working with branches

  • Separate code changes when adding a feature or making a change.
  • Easier context switches.
slide-45
SLIDE 45

Squashing commits

Say you have two commits that really should have been one. What can you do?

slide-46
SLIDE 46

Word of warning

Don’t do the following if a push has been done between the commits being squashed/merged. If you do try this things are guaranteed to break.

slide-47
SLIDE 47

Word of warning

slide-48
SLIDE 48

git commit --amend

$ git add file1 file2 $ git commit -m 'Adding some files' ... $ ls file1 file2 file3

slide-49
SLIDE 49

git commit --amend

$ git add file3 $ git commit --amend

slide-50
SLIDE 50

Merging commits

$ git rebase --interactive HEAD~2

slide-51
SLIDE 51

Warning about rebase

  • Rebasing alters the history of the repository.
  • Constantly mixing merges and rebases can cause

issues with upstream repos.

slide-52
SLIDE 52

Yay visuals!

slide-53
SLIDE 53

Rebasing commits

slide-54
SLIDE 54

Merging branches

$ git checkout <branch to merge into> $ git merge <branch to merge>

slide-55
SLIDE 55

Merging branches

slide-56
SLIDE 56

Rebasing branches

$ git checkout <branch to merge into> $ git rebase <branch to merge>

slide-57
SLIDE 57

Rebasing branches

slide-58
SLIDE 58

Merging vs Rebasing

  • There are two camps about this

matter.

  • Merging keeps the commit

structure (branch info) intact, but creates empty commits.

  • Rebasing flattens the commit

structure, and avoids creating empty commits.

slide-59
SLIDE 59

Finding bugs (and who introduced them)

Useful Git tools:

  • git bisect
  • git blame
slide-60
SLIDE 60

Git Bisect

$ git bisect start <bad> <good> $ git bisect bad or $ git bisect good $ git bisect reset This is just the start of what bisect can do!

slide-61
SLIDE 61

Git Blame

$ git blame <file or commit SHA>

slide-62
SLIDE 62

Thank you!