Files
mapas-mentales/mindmap/Appendix A_ Git in Other Environments.md

16 KiB
Raw Permalink Blame History

# Appendix A: Git in Other Environments

## Purpose / framing
- Youve learned Git at the command line
  - Work with local files
  - Connect repositories over a network
  - Collaborate effectively
- Git is often part of a larger ecosystem
  - Terminal isnt always the best interface
- Goal of this appendix
  - Survey other environments where Git is useful
  - Show how other applications work alongside Git

## Graphical Interfaces (GUIs)
- Gits native environment: the terminal
  - New features appear there first
  - Full power is available at the command line
- Why GUIs exist / when they help
  - Plain text isnt best for all tasks
  - Visual representations can be essential
  - Some users prefer point-and-click workflows
- Tools differ by intended workflow
  - Some clients expose only a curated subset of Git
    - To support a specific way of working the author considers effective
  - “Better” is workflow-dependent
    - Tools are more/less fit for purpose, not universally better
- Key constraint
  - GUIs cant do anything the command line client cant
  - Command line = most power and control

## gitk and git-gui (bundled with Git)

### gitk (graphical history viewer)
- What it is
  - GUI history viewer
  - Think: powerful GUI shell over
    - `git log`
    - `git grep`
- Best used for
  - Finding something that happened in the past
  - Visualizing project history
- How to start
  - In a Git repo directory
    - `cd <repo>`
  - Run:
    - `gitk [git log options]`
- Options
  - Accepts many command-line options
  - Most are passed through to underlying `git log`
  - Especially useful:
    - `--all`
      - Show commits reachable from any ref (not just `HEAD`)
- Interface overview (Figure 151: The gitk history viewer)
  - Top area (graph; similar to `git log --graph`)
    - Dot = commit
    - Lines = parent relationships
    - Refs = colored boxes
    - Yellow dot = `HEAD`
    - Red dot = changes not yet a commit
  - Bottom area (selected commit)
    - Left = comments + patch
    - Right = summary view
  - Middle controls
    - Searching history controls

### git-gui (commit crafting tool)
- What it is
  - Primarily a tool for crafting commits
- How to start
  - Run:
    - `git gui`
- Interface overview (Figure 152: The git-gui commit tool)
  - Left: index (staging area)
    - Unstaged changes: top
    - Staged changes: bottom
    - Move entire files between states
      - Click file icons
    - Select a file for viewing
      - Click file name
  - Top right: diff view
    - Shows changes for the selected file
    - Stage granular changes
      - Stage individual hunks (or lines) by right-clicking
  - Bottom right: message + action area
    - Enter commit message
    - Click “Commit”
      - Similar to `git commit`
    - Amend last commit workflow
      - Select “Amend” radio button
        - Updates “Staged Changes” with contents of last commit
      - Then
        - Stage/unstage changes
        - Alter commit message
        - Click “Commit” again
          - Replaces old commit with a new one

### Tool style classification
- `gitk` and `git-gui` are **task-oriented tools**
  - Tailored to one purpose each
    - `gitk`: viewing/searching history
    - `git-gui`: creating/amending commits
  - Omit features not needed for that task

## GitHub for macOS and Windows
- What these clients are
  - Two **workflow-oriented** Git clients
    - One for Windows
    - One for macOS
  - Workflow-oriented meaning
    - Focus on a curated set of commonly used features
    - Avoid exposing all of Gits functionality
- Similarity across platforms
  - Designed to look and work very much alike
  - Treated as a single product here
- Not a full product rundown
  - They have their own documentation
  - Focus here: “changes” view tour (main work area)

### “Changes” view: main areas
- Left: repositories list (tracked by client)
  - Add repo via “+” icon
    - Clone
    - Attach local repository
- Center: commit-input area
  - Enter commit message
  - Select which files to include
  - Commit history placement differs
    - Windows: directly below
    - macOS: separate tab
- Right: diff view
  - Shows working directory changes
  - Or changes included in selected commit
- Top-right: “Sync” button
  - Primary network interaction method
- Important note
  - No GitHub account required
  - Designed to highlight GitHub service/workflow
  - Still works with
    - Any repository
    - Any Git host (network operations)

### Installation
- Download locations
  - GitHub for Windows: <https://windows.github.com>
  - GitHub for macOS: <https://mac.github.com>
- First run behavior
  - Walks through first-time Git setup
    - Configure name
    - Configure email address
  - Sets sane defaults for common config options
    - Credential caches
    - CRLF behavior
- Update model
  - “Evergreen”
    - Updates downloaded/installed in background while app is open
  - Bundled Git
    - Likely no need to manually update Git separately
- Windows addition
  - Includes shortcut to launch PowerShell with Posh-git (covered later)
- Add repositories
  - Shows list of GitHub repos you have access to
    - Clone in one step
  - Add existing local repo
    - Drag directory from
      - Finder (macOS)
      - Windows Explorer (Windows)
    - Added to repository list on the left

### Recommended Workflow (“GitHub Flow”)
- Covered elsewhere in more detail (“The GitHub Flow”), gist here
  - (a) Commit to a branch
  - (b) Sync with a remote repository fairly regularly
- Branch management differences
  - macOS
    - “Create Branch” button at top of window (Figure 155)
  - Windows
    - Type new branch name in branch-switching widget (Figure 156)
- Making commits
  - Make changes in working directory
  - Client shows changed files
  - Enter commit message
  - Select files to include
  - Click “Commit”
    - Shortcut: `Ctrl-Enter` (Windows) or `⌘-Enter` (macOS)
- Network interaction via “Sync”
  - Git internally separates
    - push / fetch / merge / rebase
  - GitHub clients collapse these into one multi-step feature
  - Clicking “Sync” does
    1. `git pull --rebase`
       - If fails due to merge conflict
         - Fall back to `git pull --no-rebase`
    2. `git push`
  - Rationale
    - Common network sequence in this style
    - Squashing into one command saves time

### GitHub client summary (fit and tradeoffs)
- Strengths
  - Well-suited to intended workflow
  - Developers and non-developers can collaborate within minutes
  - Best practices baked into the tools
- When to choose something else
  - Workflow differs
  - Want more control over
    - How network operations are done
    - When network operations are done
  - Recommendation
    - Use another client or the command line

## Other GUIs (general landscape)
- Many graphical Git clients exist
  - From specialized single-purpose tools
  - To apps that try to expose everything Git can do
- Where to find them
  - Official Git site curated list: <https://git-scm.com/downloads/guis>
  - More comprehensive list (Git wiki):
    - <https://git.wiki.kernel.org/index.php/Interfaces,_frontends,_and_tools#Graphical_Interfaces>

## Git in Visual Studio
- Built-in Git tooling
  - Starting Visual Studio 2019 version 16.8
- Supported Git functionality
  - Create or clone a repository
  - Open and browse repository history
  - Create and checkout branches and tags
  - Stash, stage, and commit changes
  - Fetch, pull, push, or sync commits
  - Merge and rebase branches
  - Resolve merge conflicts
  - View diffs
  - “…and more!”
- Next step
  - Read official documentation

## Git in Visual Studio Code
- Built-in Git support
- Requirement
  - Git version 2.0.0 (or newer) installed
- Main features
  - Diff in the gutter for the file you are editing
  - Git Status Bar (lower left)
    - Current branch
    - Dirty indicators
    - Incoming commits
    - Outgoing commits
  - Common operations inside the editor
    - Initialize a repository
    - Clone a repository
    - Create branches and tags
    - Stage and commit changes
    - Push/pull/sync with a remote branch
    - Resolve merge conflicts
    - View diffs
- GitHub Pull Requests support (extension)
  - <https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github>
- Official documentation
  - <https://code.visualstudio.com/Docs/editor/versioncontrol>

## Git in JetBrains IDEs (IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine / others)
- Git Integration plugin
  - Ships with JetBrains IDEs
- Provides
  - Dedicated IDE view for Git
  - Dedicated IDE view for GitHub Pull Requests
  - Example: Version Control ToolWindow (Figure 157)
- Dependency
  - Relies on command-line `git`
  - Requires `git` to be installed
- Official documentation
  - <https://www.jetbrains.com/help/idea/using-git-integration.html>

## Git in Sublime Text
- Availability
  - From version 3.2 onwards
- Features
  - Sidebar shows git status with a badge/icon
  - `.gitignore`-listed files/folders are faded in sidebar
  - Status bar shows
    - Current git branch
    - How many modifications you have made
  - Gutter markers show all changes to a file
  - Partial integration with Sublime Merge
    - Use some Sublime Merge git client functionality from within Sublime Text
    - Requires Sublime Merge installed
    - Sublime Merge: <https://www.sublimemerge.com/>
- Official documentation
  - <https://www.sublimetext.com/docs/3/git_integration.html>

## Git in Bash
- Motivation
  - Use shell features to make Git friendlier in Bash
- Note
  - Git ships with plugins for several shells
  - Not enabled by default

### Enable tab completion (`git-completion.bash`)
- Get completion script matching your Git version
  - Check version: `git version`
  - In Git source for that release
    - `git checkout tags/vX.Y.Z` (match your installed version)
  - Copy file:
    - `contrib/completion/git-completion.bash`
  - Place somewhere handy (example)
    - Home directory
- Enable in `~/.bashrc`
  - Add:
    - `. ~/git-completion.bash`
- Use completion
  - Inside a Git repository, type
    - `git chec<tab>`
    - Auto-completes to `git checkout`
  - Completion coverage
    - Git subcommands
    - Command-line parameters
    - Remotes and ref names (where appropriate)

### Customize prompt (`git-prompt.sh`)
- Motivation
  - Show Git info in prompt
    - Current branch
    - Working directory status
- Setup
  - Copy file from Git source:
    - `contrib/completion/git-prompt.sh`
  - Place in home directory
  - Add to `~/.bashrc`
    - `. ~/git-prompt.sh`
    - `export GIT_PS1_SHOWDIRTYSTATE=1`
    - `export PS1='\w$(__git_ps1 " (%s)")\$ '`
- Meaning of prompt pieces
  - `\w`
    - Print current working directory
  - `\$`
    - Print `$` part of the prompt
  - `__git_ps1 " (%s)"`
    - Calls function provided by `git-prompt.sh`
    - Uses formatting argument `" (%s)"`
- Result
  - Prompt shows Git context inside Git-controlled projects (Figure 158)
- Further info
  - Both scripts have documentation
    - Inspect `git-completion.bash`
    - Inspect `git-prompt.sh`

## Git in Zsh

### Tab completion
- Enable
  - Add to `~/.zshrc`
    - `autoload -Uz compinit && compinit`
- Interface (more powerful than Bash)
  - Example: `git che<tab>`
    - Shows options with descriptions, e.g.
      - `check-attr` — display gitattributes information
      - `check-ref-format` — ensure a reference name is well formed
      - `checkout` — checkout branch or paths to working tree
      - `checkout-index` — copy files from index to working directory
      - `cherry` — find commits not merged upstream
      - `cherry-pick` — apply changes introduced by an existing commit
  - Ambiguous completions
    - Not just listed; include helpful descriptions
    - Navigate list by repeatedly hitting tab
  - Completion scope
    - Git commands and arguments
    - Refs/remotes and other repo-internal names
    - Filenames and standard Zsh completions

### Prompt integration with `vcs_info`
- Built-in framework
  - `vcs_info` provides VCS information for prompts
- Configure branch name in right prompt
  - Add to `~/.zshrc`
    - `autoload -Uz vcs_info`
    - `precmd_vcs_info() { vcs_info }`
    - `precmd_functions+=( precmd_vcs_info )`
    - `setopt prompt_subst`
    - `RPROMPT='${vcs_info_msg_0_}'`
    - `# PROMPT='${vcs_info_msg_0_}%# '`
    - `zstyle ':vcs_info:git:*' formats '%b'`
- Result
  - Branch shown on right side inside Git repos (Figure 159)
  - Left-side prompt also possible
    - Uncomment the `PROMPT=...` line
- Documentation
  - `vcs_info` docs in `zshcontrib(1)`
  - Online:
    - <http://zsh.sourceforge.net/Doc/Release/User-Contributions.html#Version-Control-Information>

### Alternative: Gits `git-prompt.sh`
- Option
  - Use Gits `git-prompt.sh` instead of `vcs_info`
- Compatibility
  - Works with Bash and Zsh
- Reference
  - <https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh>

### Zsh framework: oh-my-zsh
- What it is
  - A framework to enhance Zsh
- Location
  - <https://github.com/robbyrussell/oh-my-zsh>
- Git-related value
  - Powerful git tab completion via plugin system
  - Many prompt “themes” showing version-control data
  - Example theme shown (Figure 160)

## Git in PowerShell

### Why / what
- Limitation
  - `cmd.exe` isnt really capable of a customized Git experience
- If using PowerShell
  - `posh-git` provides
    - Powerful tab completion
    - Enhanced prompt (repository status awareness)
  - Works with PowerShell Core on Linux/macOS too
  - Project: <https://github.com/dahlbyk/posh-git>
  - Example shown (Figure 161)

### Installation

#### Prerequisites (Windows only): ExecutionPolicy
- Requirement
  - Set local `ExecutionPolicy` to `RemoteSigned`
    - Anything except `Undefined` and `Restricted`
- `AllSigned` vs `RemoteSigned`
  - `AllSigned`
    - Local scripts (your own) also need digital signatures
  - `RemoteSigned`
    - Only scripts with `ZoneIdentifier` = Internet (downloaded from web) need signatures
    - Others do not
- Scope guidance
  - Admin / all users
    - `-Scope LocalMachine`
  - Normal user / no admin rights
    - `-Scope CurrentUser`
- References
  - Scopes: <https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_scopes>
  - ExecutionPolicy: <https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy>
- Set `RemoteSigned` for all users
  - `Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy RemoteSigned -Force`

#### Install via PowerShell Gallery
- When available
  - PowerShell 5+, or PowerShell 4 with PackageManagement installed
- Reference
  - <https://docs.microsoft.com/en-us/powershell/scripting/gallery/overview>
- Install commands (CurrentUser)
  - `Install-Module posh-git -Scope CurrentUser -Force`
  - `Install-Module posh-git -Scope CurrentUser -AllowPrerelease -Force`
    - Newer beta with PowerShell Core support
- Install for all users
  - Use `-Scope AllUsers`
  - Run from elevated PowerShell console
- If install fails due to `PowerShellGet` error
  - Run first:
    - `Install-Module PowerShellGet -Force -SkipPublisherCheck`
  - Then retry
  - Reason given
    - Built-in Windows PowerShell modules are signed with a different publishment certificate

#### Update PowerShell prompt (load automatically)
- Import now
  - `Import-Module posh-git`
- Auto-import every time PowerShell starts
  - `Add-PoshGitToProfile -AllHosts`
  - Adds import statement to `$profile` script
- Note
  - Multiple `$profile` scripts exist
    - e.g., console profile vs ISE profile

#### Install from source
- Download a release
  - <https://github.com/dahlbyk/posh-git/releases>
- Uncompress
- Import module via full path to `posh-git.psd1`
  - `Import-Module <path-to-uncompress-folder>\src\posh-git.psd1`
- Add to profile
  - `Add-PoshGitToProfile -AllHosts`
- Effect
  - Adds proper line to `profile.ps1`
  - Active next time PowerShell opens

#### Further references (prompt meaning & customization)
- Git status summary information
  - <https://github.com/dahlbyk/posh-git/blob/master/README.md#git-status-summary-information>
- Prompt customization variables
  - <https://github.com/dahlbyk/posh-git/blob/master/README.md#customization-variables>

## Appendix summary
- You can harness Git from within everyday tools (GUIs, IDEs, editors, shells)
- You can also access Git repositories from your own programs