diff --git a/Library/Contributions/manpages/brew.1.md b/Library/Contributions/manpages/brew.1.md
index 5cb4e1805ce43721e837fafc05c32df2e0876723..f87c8a96c837bd0bd72d80abfc84a1327fdb3173 100644
--- a/Library/Contributions/manpages/brew.1.md
+++ b/Library/Contributions/manpages/brew.1.md
@@ -369,6 +369,15 @@ can take several different forms:
 
 ## ENVIRONMENT
 
+  * GIT:
+    When using Git, Homebrew will use `GIT` if set,
+    a Homebrew-built Git if installed, or the system-provided binary.
+
+    Set this to force Homebrew to use a particular git binary.
+
+  * EDITOR:
+    If set, and `HOMEBREW_EDITOR` is not, use `EDITOR` as the text editor.
+
   * HOMEBREW\_BUILD\_FROM\_SOURCE:
     If set, instructs Homebrew to compile from source even when a formula
     provides a bottle.
diff --git a/Library/Homebrew/download_strategy.rb b/Library/Homebrew/download_strategy.rb
index d5da87b9310dac505a68adb326c44ec573c990cb..73aeeda5708c6b6b95b19a281c63910f11491116 100644
--- a/Library/Homebrew/download_strategy.rb
+++ b/Library/Homebrew/download_strategy.rb
@@ -315,6 +315,7 @@ end
 class GitDownloadStrategy < AbstractDownloadStrategy
   def initialize name, package
     super
+    @@git ||= find_git
     @unique_token="#{name}--git" unless name.to_s.empty? or name == '__UNKNOWN__'
     @clone=HOMEBREW_CACHE+@unique_token
   end
@@ -339,7 +340,7 @@ class GitDownloadStrategy < AbstractDownloadStrategy
     if @clone.exist?
       Dir.chdir(@clone) do
         # Check for interupted clone from a previous install
-        unless system 'git', 'status', '-s'
+        unless system @@git, 'status', '-s'
           puts "Removing invalid .git repo from cache"
           FileUtils.rm_rf @clone
         end
@@ -348,7 +349,7 @@ class GitDownloadStrategy < AbstractDownloadStrategy
 
     unless @clone.exist?
       # Note: first-time checkouts are always done verbosely
-      clone_args = %w[git clone]
+      clone_args = [@@git, 'clone']
       clone_args << '--depth' << '1' if support_depth?
 
       case @spec
@@ -361,15 +362,15 @@ class GitDownloadStrategy < AbstractDownloadStrategy
     else
       puts "Updating #{@clone}"
       Dir.chdir(@clone) do
-        safe_system 'git', 'config', 'remote.origin.url', @url
+        safe_system @@git, 'config', 'remote.origin.url', @url
 
-        safe_system 'git', 'config', 'remote.origin.fetch', case @spec
+        safe_system @@git, 'config', 'remote.origin.fetch', case @spec
           when :branch then "+refs/heads/#{@ref}:refs/remotes/origin/#{@ref}"
           when :tag then "+refs/tags/#{@ref}:refs/tags/#{@ref}"
           else '+refs/heads/master:refs/remotes/origin/master'
           end
 
-        git_args = %w[git fetch origin]
+        git_args = [@@git, 'fetch', 'origin']
         quiet_safe_system(*git_args)
       end
     end
@@ -382,27 +383,34 @@ class GitDownloadStrategy < AbstractDownloadStrategy
         ohai "Checking out #{@spec} #{@ref}"
         case @spec
         when :branch
-          nostdout { quiet_safe_system 'git', 'checkout', "origin/#{@ref}", '--' }
+          nostdout { quiet_safe_system @@git, 'checkout', "origin/#{@ref}", '--' }
         when :tag, :revision
-          nostdout { quiet_safe_system 'git', 'checkout', @ref, '--' }
+          nostdout { quiet_safe_system @@git, 'checkout', @ref, '--' }
         end
       else
         # otherwise the checkout-index won't checkout HEAD
         # https://github.com/mxcl/homebrew/issues/7124
         # must specify origin/HEAD, otherwise it resets to the current local HEAD
-        quiet_safe_system "git", "reset", "--hard", "origin/HEAD"
+        quiet_safe_system @@git, "reset", "--hard", "origin/HEAD"
       end
       # http://stackoverflow.com/questions/160608/how-to-do-a-git-export-like-svn-export
-      safe_system 'git', 'checkout-index', '-a', '-f', "--prefix=#{dst}/"
+      safe_system @@git, 'checkout-index', '-a', '-f', "--prefix=#{dst}/"
       # check for submodules
       if File.exist?('.gitmodules')
-        safe_system 'git', 'submodule', 'init'
-        safe_system 'git', 'submodule', 'update'
-        sub_cmd = "git checkout-index -a -f \"--prefix=#{dst}/$path/\""
-        safe_system 'git', 'submodule', '--quiet', 'foreach', '--recursive', sub_cmd
+        safe_system @@git, 'submodule', 'init'
+        safe_system @@git, 'submodule', 'update'
+        sub_cmd = "#{@@git} checkout-index -a -f \"--prefix=#{dst}/$path/\""
+        safe_system @@git, 'submodule', '--quiet', 'foreach', '--recursive', sub_cmd
       end
     end
   end
+
+  # Try GIT, a Homebrew-built Git, and finally the OS X system Git.
+  def find_git
+    return ENV['GIT'] if ENV['GIT']
+    return "#{HOMEBREW_PREFIX}/bin/git" if File.exist? "#{HOMEBREW_PREFIX}/bin/git"
+    return MacOS.locate 'git'
+  end
 end
 
 class CVSDownloadStrategy < AbstractDownloadStrategy
diff --git a/share/man/man1/brew.1 b/share/man/man1/brew.1
index a1f434f83fc5285d305d58688fc4b8200122c6e9..2208043cb08b2b695843901d00f7562862913699 100644
--- a/share/man/man1/brew.1
+++ b/share/man/man1/brew.1
@@ -409,6 +409,17 @@ Homebrew can install formulae via URL, e\.g\. \fBhttps://raw\.github\.com/mxcl/h
 .SH "ENVIRONMENT"
 .
 .TP
+GIT
+When using Git, Homebrew will use \fBGIT\fR if set, a Homebrew\-built Git if installed, or the system\-provided binary\.
+.
+.IP
+Set this to force Homebrew to use a particular git binary\.
+.
+.TP
+EDITOR
+If set, and \fBHOMEBREW_EDITOR\fR is not, use \fBEDITOR\fR as the text editor\.
+.
+.TP
 HOMEBREW_BUILD_FROM_SOURCE
 If set, instructs Homebrew to compile from source even when a formula provides a bottle\.
 .