Git是一个开源的分布式版本控制系统,功能强大,本文手把手教大家从零开始安装Git(基于windows环境)以及分享Git日常使用的小技巧和知识
一、安装Git
1、首先肯定需要下载安装包,可以去Git开源社区网站下载,链接如下:https://git-scm.com/
进入网站,里面有本Pro Git book,指导你如何使用Git,讲得比较全,强烈推荐初学者学习
2、安装基本一路next,安装完毕后鼠标右击会有Git Bash Here选项,点击进行git的命令行操作
3、初始化git仓库后,便可以在仓库根目录下使用git命令,如果不在Git仓库下则无法执行Git有关命令。关于git的基本命令这里不细说了,大家有不熟悉的可以参考上面的Git Pro Book,以下概念对git配置比较重要
Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:
/etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量。
~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 可以传递 --global 选项让 Git 读写此文件。
当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库。
每一个级别覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。
在 Windows 系统中,Git 会查找 $HOME 目录下(一般情况下是 C:\Users\$USER)的 .gitconfig 文件。 Git 同样也会寻找 /etc/gitconfig 文件,但只限于 MSys 的根目录下,即安装 Git 时所选的目标位置。
二、配置Git(别名)
现在主流的一些集成开发工具如IDEA都已经集成Git,可以在IDEA里进行图形化界面操作,十分方便,但命令行始终还是最强大的,如果你习惯于使用命令行操作的话,面对有些比较长的Git命令,如果能给它设置别名必然能提高我们的开发效率,不用每次都输入重复的长命令。
关于windows下配置Git别名有以下几种方式
1、利用Git自带的别名功能
具体方式:git config --global alias.别名 命令
因为设置级别为global,即用户级别,windows下git会将别名写入你C盘用户的.gitconfig中,如果不加global条件,则默认写入你仓库的config中,只针对当前仓库有效。当然也可以手动在配置文件中按照格式要求写入别名。
2、上述配置确实简化了命令,但还是要输入前面的git,因为git bash 默认所有的命令都要以git开头,但如果我连git都懒得打呢,比如输入gs直接达到git status的效果,有三种方法
(1)、直接修改git bash的别名设置,因为git bash自身也是有别名的,如果修改了它的别名就能进一步简化命令
修改Git安装目录下的etc/bash.bashrc文件,在里面加入别名设置即可
(2)、上述配置能进一步简化命令,但是有一点麻烦是你需要找到你的工作区然后右击Git Bash Here才能输入git命令,但现在大家都是用IDEA等开发工具,在提交时再切到工作区执行git命令似乎有些麻烦,有没有办法直接在IDEA的Terminal终端中直接执行Git命令呢?
可以在windows中安装bash,直接在终端启动bash,输入Git命令
关于如何安装windows bash可以参考这篇文章,这里不再赘述 https://www.jianshu.com/p/a90591d5db0c
如果输入bash时提示 bash: ./xx: Permission denied,输入 sudo chmod 777 ./xx 获得可读可写可执行权限即可
打开IDEA终端直接输入bash,便可进行Git操作,bash的别名设置直接修改配置文件即可,也可以用命令alias name=value 进行设置,不过不是永久保存的
配置文件位置:{你C盘用户目录}\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\{你的bash用户名}\.bashrc
具体可能每个人不一样,我自己的位置是在C:\Users\超\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\gcc\.bashrc
按格式加入别名即可
(3)、可以用zsh的git plugin,当然前提是要安装bash,这个插件里内置了很多git别名可以直接在IDEA终端中使用,我觉得上面的bash基本满足我的日常使用了,所以没有下这个插件,感兴趣的小伙伴可以自行搜索下载
三、配置Git(ssh)
客户端与Git远程仓库如github通信主要有两种方式,https和ssh,因为ssh传输比较安全,速度稍快于https,所以日常基本都用ssh方式拉取和推送代码
用ssh方式首先要在本地生成一对密钥(公钥和私钥),公钥复制到github等远程服务器,私钥存于自己电脑上保存,通过ssh方式拉取和推送代码远程仓库都会通过密钥进行权限验证。
1、首先,你需要确认自己是否已经拥有密钥。 默认情况下,用户的 SSH 密钥存储在其 ~/.ssh 目录下。 进入该目录并列出其中内容,你便可以快速确认自己是否已拥有密钥:
$ cd ~/.ssh
$ ls
authorized_keys2 id_dsa known_hosts
config id_dsa.pub
2、我们需要寻找一对以 id_dsa 或 id_rsa 命名的文件,其中一个带有 .pub 扩展名。 .pub 文件是你的公钥,另一个则是私钥。 如果找不到这样的文件(或者根本没有 .ssh 目录),你可以通过运行 ssh-keygen程序来创建它们。在 Linux/Mac 系统中,ssh-keygen 随 SSH 软件包提供;在 Windows 上,该程序包含于 MSysGit 软件包中。
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/schacon/.ssh/id_rsa):
Created directory '/home/schacon/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/schacon/.ssh/id_rsa.
Your public key has been saved in /home/schacon/.ssh/id_rsa.pub.
The key fingerprint is:
d0:82:24:8e:d7:f1:bb:9b:33:53:96:93:49:da:9b:e3 schacon@mylaptop.local
还可以用以下命令细分 ssh-keygen -t rsa -c '邮箱等'
密钥类型可以用 -t 选项指定。如果没有指定则默认生成用于SSH-2的RSA密钥。这里使用的是rsa。 同时在密钥中有一个注释字段,用-C来指定所指定的注释,可以方便用户标识这个密钥,指出密钥的 用途或其他有用的信息。所以在这里输入自己的邮箱或者其他都行。 输入完毕后程序同时要求输入一 个密语字符串(passphrase),空表示没有密语。接着会让输入2次口令(password),空表示没有口 令。3次回车 即可完成当前步骤,此时[windows:c盘>用户>自己的用户名>.ssh, Linux:用户>.ssh]目录下已经生成好了。
3、接着把公钥放到远程服务器即可,拷贝id_rsa.pub中内容添加到远程仓库即可
以github为例,在此添加公钥,添加完成后,输入ssh -T git@github.com即可测试认证
如果提示 You've successfully authenticated,说明ssh认证成功
4、最后有关bash向远程仓库提交和拉取代码的问题,因为bash和windows本地用户不是一个,所以需要在bash中再单独生成ssh密钥,位置默认在:{你C盘用户目录}\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\{你的bash用户名}\.ssh文件夹下,复制公钥到远程仓库即可
另外还需要在bash中单独设置git的用户名和邮箱,否则git无法识别你的身份
使用命令
git config --global user.name 'xxx'
git config --global user.email 'xxx@123.com'
指定用户级别的用户名和邮箱即可
四、Git知识技巧
1、我自己的git别名分享
alias cl='clear'
alias ei='exit'
alias lo='logout'
alias g='git'
alias gi='git init'
alias gs='git status'
alias grl='git reflog'
alias gl="git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"
alias glds="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short"
alias gllas="git log -1 HEAD --pretty='%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short"
alias gllat="git for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname:short) [%(committername)]'"
alias gb='git branch'
alias gbv='git branch -v'
alias gba='git branch -a'
alias gbd='git branch -d'
alias gc='git commit'
alias gcm='git commit -m'
alias gcam='git commit --amend -m'
alias gcl='git clone'
alias ga='git add'
alias gaa='git add --all'
alias ga.='git add .'
alias gpl='git pull'
alias gp='git push'
alias gpf='git push -f'
alias grb='git rebase'
alias gco='git checkout'
alias gcob='git checkout -b'
alias gf='git fetch'
alias gm='git merge'
alias gra='git remote add'
alias grm='git rm'
alias grmc='git rm --cached'
alias grv='git remote -v'
alias gcf='git config'
alias gcfl='git config --list'
alias gcp='git cherry-pick'
alias grhh1='git reset --hard HEAD^'
alias grhh2='git reset --hard HEAD@{2}'
alias ssht='ssh -T git@github.com'
alias sshk='ssh-keygen -t rsa'
#以下为方便回忆用,实际不使用的别名
alias ggsup='git branch --set-upstream-to=origin/$(git_current_branch)'
alias gpsup='git push --set-upstream origin $(git_current_branch)'
alias gstash='git stash'
alias gtam="git tag -a tagname -m 'commit message'"
alias gcfgun='git config --global user.name'
alias gcfusun='git config --unset user.name'
alias gpodm='git push origin --delete master'
2、git fetch 与 git pull 的区别:
git fetch 拉取远程分支,新建远程分支的本地仓库(commit id),不合并
git pull = git fetch + git merge 拉取远程分支,更新本地仓库,直接合并到工作区
3、git cherry-pick commitId 挑拣分支提交合并