GitGitNotes for Professionals Notes for Professionals100 pagesof professional hints and tricksGoalKicker.comFree Programming BooksDisclaimerThis is an uno cial free book created for educational purposes and isnot a liated with o cial Git group(s) or company(s).All trademarks and registered trademarks arethe property of their respective owners
ContentsAbout . 1Chapter 1: Getting started with Git . 2Section 1.1: Create your ﬁrst repository, then add and commit ﬁles . 2Section 1.2: Clone a repository . 4Section 1.3: Sharing code . 4Section 1.4: Setting your user name and email . 5Section 1.5: Setting up the upstream remote . 6Section 1.6: Learning about a command . 6Section 1.7: Set up SSH for Git . 6Section 1.8: Git Installation . 7Chapter 2: Browsing the history . 10Section 2.1: "Regular" Git Log . 10Section 2.2: Prettier log . 11Section 2.3: Colorize Logs . 11Section 2.4: Oneline log . 11Section 2.5: Log search . 12Section 2.6: List all contributions grouped by author name . 12Section 2.7: Searching commit string in git log . 13Section 2.8: Log for a range of lines within a ﬁle . 14Section 2.9: Filter logs . 14Section 2.10: Log with changes inline . 14Section 2.11: Log showing commited ﬁles . 15Section 2.12: Show the contents of a single commit . 15Section 2.13: Git Log Between Two Branches . 16Section 2.14: One line showing commiter name and time since commit . 16Chapter 3: Working with Remotes . 17Section 3.1: Deleting a Remote Branch . 17Section 3.2: Changing Git Remote URL . 17Section 3.3: List Existing Remotes . 17Section 3.4: Removing Local Copies of Deleted Remote Branches . 17Section 3.5: Updating from Upstream Repository . 18Section 3.6: ls-remote . 18Section 3.7: Adding a New Remote Repository . 18Section 3.8: Set Upstream on a New Branch . 18Section 3.9: Getting Started . 19Section 3.10: Renaming a Remote . 19Section 3.11: Show information about a Speciﬁc Remote . 20Section 3.12: Set the URL for a Speciﬁc Remote . 20Section 3.13: Get the URL for a Speciﬁc Remote . 20Section 3.14: Changing a Remote Repository . 20Chapter 4: Staging . 21Section 4.1: Staging All Changes to Files . 21Section 4.2: Unstage a ﬁle that contains changes . 21Section 4.3: Add changes by hunk . 21Section 4.4: Interactive add . 22Section 4.5: Show Staged Changes . 22Section 4.6: Staging A Single File . 23
Section 4.7: Stage deleted ﬁles . 23Chapter 5: Ignoring Files and Folders . 24Section 5.1: Ignoring ﬁles and directories with a .gitignore ﬁle . 24Section 5.2: Checking if a ﬁle is ignored . 26Section 5.3: Exceptions in a .gitignore ﬁle . 27Section 5.4: A global .gitignore ﬁle . 27Section 5.5: Ignore ﬁles that have already been committed to a Git repository . 27Section 5.6: Ignore ﬁles locally without committing ignore rules . 28Section 5.7: Ignoring subsequent changes to a ﬁle (without removing it) . 29Section 5.8: Ignoring a ﬁle in any directory . 29Section 5.9: Preﬁlled .gitignore Templates . 29Section 5.10: Ignoring ﬁles in subfolders (Multiple gitignore ﬁles) . 30Section 5.11: Create an Empty Folder . 31Section 5.12: Finding ﬁles ignored by .gitignore . 31Section 5.13: Ignoring only part of a ﬁle [stub] . 32Section 5.14: Ignoring changes in tracked ﬁles. [stub] . 33Section 5.15: Clear already committed ﬁles, but included in .gitignore . 34Chapter 6: Git Di . 35Section 6.1: Show di erences in working branch . 35Section 6.2: Show changes between two commits . 35Section 6.3: Show di erences for staged ﬁles . 35Section 6.4: Comparing branches . 36Section 6.5: Show both staged and unstaged changes . 36Section 6.6: Show di erences for a speciﬁc ﬁle or directory . 36Section 6.7: Viewing a word-di for long lines . 37Section 6.8: Show di erences between current version and last version . 37Section 6.9: Produce a patch-compatible di . 37Section 6.10: di erence between two commit or branch . 38Section 6.11: Using meld to see all modiﬁcations in the working directory . 38Section 6.12: Di UTF-16 encoded text and binary plist ﬁles . 38Chapter 7: Undoing . 40Section 7.1: Return to a previous commit . 40Section 7.2: Undoing changes . 40Section 7.3: Using reﬂog . 41Section 7.4: Undoing merges . 41Section 7.5: Revert some existing commits . 43Section 7.6: Undo / Redo a series of commits . 43Chapter 8: Merging . 45Section 8.1: Automatic Merging . 45Section 8.2: Finding all branches with no merged changes . 45Section 8.3: Aborting a merge . 45Section 8.4: Merge with a commit . 45Section 8.5: Keep changes from only one side of a merge . 45Section 8.6: Merge one branch into another . 46Chapter 9: Submodules . 47Section 9.1: Cloning a Git repository having submodules . 47Section 9.2: Updating a Submodule . 47Section 9.3: Adding a submodule . 47Section 9.4: Setting a submodule to follow a branch . 48Section 9.5: Moving a submodule . 48
Section 9.6: Removing a submodule . 49Chapter 10: Committing . 50Section 10.1: Stage and commit changes . 50Section 10.2: Good commit messages . 51Section 10.3: Amending a commit . 52Section 10.4: Committing without opening an editor . 53Section 10.5: Committing changes directly . 53Section 10.6: Selecting which lines should be staged for committing . 53Section 10.7: Creating an empty commit . 54Section 10.8: Committing on behalf of someone else . 54Section 10.9: GPG signing commits . 55Section 10.10: Commiting changes in speciﬁc ﬁles . 55Section 10.11: Committing at a speciﬁc date . 55Section 10.12: Amending the time of a commit . 56Section 10.13: Amending the author of a commit . 56Chapter 11: Aliases . 57Section 11.1: Simple aliases . 57Section 11.2: List / search existing aliases . 57Section 11.3: Advanced Aliases . 57Section 11.4: Temporarily ignore tracked ﬁles . 58Section 11.5: Show pretty log with branch graph . 58Section 11.6: See which ﬁles are being ignored by your .gitignore conﬁguration . 59Section 11.7: Updating code while keeping a linear history . 60Section 11.8: Unstage staged ﬁles . 60Chapter 12: Rebasing . 61Section 12.1: Local Branch Rebasing . 61Section 12.2: Rebase: ours and theirs, local and remote . 61Section 12.3: Interactive Rebase . 63Section 12.4: Rebase down to the initial commit .