目录
git安装及使用教程
下载和安装
1. 下载Git客户端
Git客户端下载地址 :https://code.google.com/p/msysgit/downloads/list 将地址复制到浏览器栏即可下载.
2. 安装Git客户端
欢迎界面 : 直接下一步;
协议 : 必须接受;
安装位置 : 预留100M空间, 自定义安装位置;
选择安装组件
:也可以默认选择;
-- 图标组件(Addition icons) : 选择是否创建快速启动栏图标 或者 是否创建桌面快捷方式;
-- 桌面浏览(Windows Explorer integration) : 浏览源码的方法, 单独的上下文浏览 只使用bash 或者 只用Git GUI工具; 高级的上下文浏览方法 使用git-cheetah plugin插件;
-- 关联配置文件 : 是否关联git配置文件, 该配置文件主要显示文本编辑器的样式;
-- 关联shell脚本文件 : 是否关联Bash命令行执行的脚本文件;
-- 使用TrueType编码 : 在命令行中是否使用TruthType编码, 该编码是微软和苹果公司制定的通用编码;
选择Git使用的默认编辑器
Use the Nano editor by default :默认使用 Nano 编辑器
Use Vim (The ubiquitous text editor) as Git's default editor:使用 Vim 作为 Git 的默认编辑器
Use Notepad++ as Git's default editor:使用 Notepad++ 作为 Git 的默认编辑器
Use Visual Studio Code as Git's default editor:使用 Visual Studio Code 作为 Git 的默认编辑器
开始菜单快捷方式目录
设置开始菜单中快捷方式的目录名称, 也可以选择不再开始菜单中创建快捷方式;
设置命令行工具
: 选择使用什么样的命令行工具, 一般情况下我们默认使用Git Bash即可, 默认选择;
-- Git自带 : 使用Git自带的Git Bash命令行工具;这是最安全的选择,因为您的PATH根本不会被修改。您只能使用 Git Bash 的 Git 命令行工具。
-- 系统自带CMD : 使用Windows系统的命令行工具;这个选项被认为是安全的,因为它只向PATH添加一些最小的 Git包,以避免使用可选的Unix工具混淆环境。 您将能够从 Git Bash 和 Windows 命令提示符中使用 Git。
-- 二者都有 : 上面二者同时配置, 但是注意, 这样会将windows中的find.exe 和 sort.exe工具覆盖, 如果不懂这些尽量不要选择; Git和可选的Unix工具都将添加到您计算机的 PATH 中,警告:这将覆盖Windows工具,如 “ find 和 sort ”。只有在了解其含义后才使用此选项。
传输协议
传输协议,第一个为https协议,第二个为ssl协议
Use the OpenSSL library
使用 OpenSSL 库,服务器证书将使用ca-bundle.crt文件进行验证。
Use the native Windows Secure Channel library
使用本地 Windows 安全通道库,服务器证书将使用Windows证书存储验证。此选项还允许您使用公司的内部根CA证书,例如, 通过Active Directory Domain Services 。
选择换行格式
-- 检查出windows格式转换为unix格式 : 将windows格式的换行转为unix格式的换行在进行提交;如果是跨平台的项目,在windows系统下安装git,则选择第一个。
-- 检查出原来格式转为unix格式 : 不管什么格式的, 一律转为unix格式的换行在进行提交;表示unix平台的项目。
-- 不进行格式转换 : 不进行转换, 检查出什么, 就提交什么;表示非跨平台的项目。
Checkout Windows-style,commit Unix-style line endings
在检出文本文件时,Git会将LF转换为CRLF。当提交文本文件时,CRLF将转换为LF。 对于跨平台项目,这是Windows上推荐的设置(“core.autocrlf”设置为“true”)
Checkout as-is , commit Unix-style line endings
在检出文本文件时,Git不会执行任何转换。 提交文本文件时,CRLF将转换为LF。 对于跨平台项目,这是Unix上的推荐设置 (“core.autocrlf”设置为“input”)
Checkout as-is,commit as-is
在检出或提交文本文件时,Git不会执行任何转换。对于跨平台项目,不推荐使用此选项(“core.autocrlf”设置为“false”)
终端模拟器
配置终端模拟器以与 Git Bash 一起使用
使用MinTTY:
Git的Windows客户端,会自带一个叫MinGW的Linux命令行工具,可以执行简单的shell命令,与cygwin功能类似,仅此而已。
而在MinGW命令行窗口中,执行命令“mintty”既可以打开mintty窗口,再次可以使用ssh命令登录linux服务器。
Use MinTTY (the default terminal of MSYS2)
Git Bash将使用MinTTY作为终端模拟器,该模拟器具有可调整大小的窗口,非矩形选区和Unicode字体。 Windows控制台程序(如交互式Python)必须通过'winpty'启动才能在MinTTY中运行。
Use Windows' default console window
Git将使用Windows的默认控制台窗口(“cmd.exe”),该窗口可以与Win32控制台程序(如交互式Python或node.js)一起使用,但默认的回滚非常有限,需要配置为使用unicode 字体以正确显示非ASCII字符,并且在Windows 10之前,其窗口不能自由调整大小,并且只允许矩形文本选择。
配置额外的选项
Enable file system caching
启用文件系统缓存
文件系统数据将被批量读取并缓存在内存中用于某些操作(“core.fscache”设置为“true”)。 这提供了显着的性能提升。
Enable Git Credential Manager
启用Git凭证管理器
Windows的Git凭证管理器为Windows提供安全的Git凭证存储,最显着的是对Visual Studio Team Services和GitHub的多因素身份验证支持。 (需要.NET Framework v4.5.1或更高版本)。
Enable symbolic links
启用符号链接(需要SeCreateSymbolicLink权限)。请注意,现有存储库不受此设置的影响。
开始安装 :
安装结束 : over;
Git配置
github免密登录
(1) 创建本地ssh
使用命令 : 创建本地ssh
$ ssh-keygen -t rsa -C "2367746876@qq.com"
ps: -t rsa表示使用的算法,此选项为默认选项
GitHub邮箱 : 该命令后面的邮箱就是GitHub的注册邮箱
路径选择 : 使用该命令之后, 会出现提示选择ssh-key生成路径, 这里直接点回车默认即可, 生成的ssh-key在默认路径中;
密码确认 : 这里我们不使用密码进行登录, 用密码太麻烦;
(2) 将ssh配置到GitHub中
进入生成的ssh目录 : C:\Documents and Settings\Administrator\.ssh 中, 使用记事本打开 id_rsa.pub 文件, 将该文件中的内容复制;然后进入GitHub网站 : 登录GitHub,需要先注册,选择Setting 用户设置 :
选择左侧的SSH and GPG keys选项:
点击右侧的New SSH key :
将上面复制好的ssh-key复制进去 :
(3)验证是否配置成功
使用命令 :
ssh -T git@github.com
成功提示 : 如果出现Hi han1202012! You've successfully authenticated, but GitHub does not provide shell access. 就说明配置成功, 可以连接上GitHub;
配置本地用户和邮箱
用户名邮箱作用 : 在使用git之前我们需要设置一个用户名 和 邮箱, 这是用来上传本地仓库到GitHub中, 在GitHub中显示代码上传者;
使用命令 :
//设置用户名
$ git config --global user.name "***"
//设置邮箱
$ git config --global user.email "***@qq.com"
--global 是全局配置文件 ,配置文件为用户主目录下的.gitconfig文件。
配置大小写敏感
git config --global core.ignorecase false
gitignore
# .gitignore
*/migrations/*
!*/migrations/__init__.py
media/*
!media/cache
media/cache/*
!media/cache/readme.txt
Git命令
初始化
初始化一个Git仓库,使用git init命令
git init
添加远程库
先有本地库,后有远程库。
关联远程库
当我们已有本地库,还没有远程库时,怎么关联一个远程库。
首先在GitHub上建一个空的远程仓库。
然后在本地使用命令
git remote add origin git@githubname:path/repo-name.git
origin是远程库的名字,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
例:
推送远程库
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,就可以使用命令git push origin master推送最新修改。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
从远程库克隆
从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆。
建远程库
首先,登陆GitHub,创建一个新的仓库,名字叫gitskills。我们勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。创建完毕后,可以看到README.md文件。
克隆
现在,远程库已经准备好了,下一步是用命令git clone克隆一个本地库,克隆的链接地址在GitHub上,进入刚刚创建的远程库点击“Clone or download”即可复制链接。
$ git clone git@github.com:llf-1996/gitskills.git
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Receiving objects: 100% (3/3), done.
注意把Git库的地址换成你自己的,然后进入gitskills目录看看,已经有README.md文件了。
从远程库clone时,默认情况下只能看到本地的master分支。
本地仓库提交修改
添加文件到Git仓库,分两步:
1.使用命令git add <filename>,注意,可反复多次使用,添加多个文件;
2.使用命令git commit -m <message>,message指本次提交的描述信息。
ps:
git add -A 提交所有变化;
git add -u 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new);
git add . 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件。
版本回退
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
回退到上一个版本:
$ git reset --hard HEAD^
使用命令回退指定版本:
$ git reset --hard commit_id
用git log可以查看当前版本的提交历史;用git reflog查看所有命令历史。
删除文件夹
$ git rm --cached -r filedir
$ git commit -m "删除文件夹"
$ git push
分支
创建和切换分支
首先,我们创建dev分支,然后切换到dev分支:
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev # 创建dev分支
$ git checkout dev # 切换到dev分支
Switched to branch 'dev'
查看分支
然后,用git branch命令查看当前分支:
$ git branch
* dev
master
git branch命令会列出所有分支,当前分支前面会标一个*号。
分支合并
-
merge
-
marge 特点:自动创建一个新的commit,如果合并的时候遇到冲突,仅需要修改后重新commit。
优点:记录了真实的commit情况,包括每个分支的详情
缺点:因为每次merge会自动产生一个merge commit,所以在使用一些git 的GUI tools,特别是commit比较频繁时,看到分支很杂乱。
git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit]
[-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]
[--[no-]allow-unrelated-histories]
[--[no-]rerere-autoupdate] [-m <msg>] [<commit>…]
git merge --abort
git merge --continue
# dev分支到当前分支master上
git checkout master
git merge feature
rebase
rebase 特点:会合并之前的commit历史
优点:得到更简洁的项目历史,去掉了merge commit
缺点:如果合并出现代码问题不容易定位,因为re-write了history
建议仅用于个人分支合并,不可合并多个分支。
git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
[<upstream> [<branch>]]
git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
--root [<branch>]
git rebase --continue | --skip | --abort | --quit | --edit-todo
# 合并master分支到个人分支
git checkout feature
git rebase master
删除分支
git branch -d <name>
删除dev分支
$ git branch -d dev
Deleted branch dev (was cf98a27).
本地分支与远程分支链接
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建。
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> dev
$
栗子:指定本地dev分支与远程origin/dev分支的链接
$ git branch --set-upstream-to=origin/dev dev
Branch dev set up to track remote branch dev from origin.
$
查看远程库信息
使用git remote -v;
$ git remote -v
origin git@github.com:llf-1996/learngit.git (fetch)
origin git@github.com:llf-1996/learngit.git (push)
推送本地分支
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交。
$ git push origin master
创建与远程分支对应的本地分支
从远程库clone时,默认情况下只能看到本地的master分支。在本地创建和远程分支对应的分支,使用命令:
git checkout -b branch-name origin/branch-name
本地和远程分支的名称最好一致;
本地新建的分支如果不推送到远程,对其他人就是不可见的。
标签管理
创建标签
命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id,指定commit id表示对此提交添加标签。
指定标签信息
命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
$ git tag -a v0.1 -m "version 0.1 released" 1094adb
用-a指定标签名,-m指定说明文字,1094adb指对应的commit id。
查看标签信息
git show <tagname>查看标签信息:
$ git show v0.9
commit f52c63349bc3c1593499807e5c8e972b82c8f286 (tag: v0.9)
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:56:54 2018 +0800
add merge
diff --git a/readme.txt b/readme.txt
...
查看所有标签
命令git tag可以查看所有标签。
删除标签
$ git tag -d v0.1
Deleted tag 'v0.1' (was f15b0dd)
推送标签到远程
命令git push origin <tagname>可以推送一个本地标签;
命令git push origin --tags可以推送全部未推送过的本地标签
例:
如果要推送某个标签到远程,使用命令git push origin <tagname>:
$ git push origin v1.0
Total 0 (delta 0), reused 0 (delta 0)
To github.com:michaelliao/learngit.git
* [new tag] v1.0 -> v1.0
推送全部尚未推送到远程的本地标签:
$ git push origin --tags
Total 0 (delta 0), reused 0 (delta 0)
To github.com:michaelliao/learngit.git
* [new tag] v0.9 -> v0.9
删除远程标签
命令git tag -d <tagname>可以删除一个本地标签;
命令git push origin :refs/tags/<tagname>可以删除一个远程标签。
例:
1. 如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
$ git tag -d v0.9
Deleted tag 'v0.9' (was f52c633)
2. 然后,从远程删除。删除命令也是push,但是格式如下:
$ git push origin :refs/tags/v0.9
To github.com:michaelliao/learngit.git
- [deleted] v0.9
一个本地库既关联GitHub,又关联码云
以learngit本地库为例,我们先删除已关联的名为origin的远程库:
$ git remote rm origin
然后,先关联GitHub的远程库(也可先关联码云):
$ git remote add github git@github.com:michaelliao/learngit.git
注意,远程库的名称叫github,不叫origin了。
接着,再关联码云的远程库:
$ git remote add gitee git@gitee.com:liaoxuefeng/learngit.git
同样注意,远程库的名称叫gitee,不叫origin。
现在,我们用git remote -v查看远程库信息,可以看到两个远程库:
$ git remote -v
gitee git@gitee.com:liaoxuefeng/learngit.git (fetch)
gitee git@gitee.com:liaoxuefeng/learngit.git (push)
github git@github.com:michaelliao/learngit.git (fetch)
github git@github.com:michaelliao/learngit.git (push)
如果要推送到GitHub,使用命令:
git push github master
如果要推送到码云,使用命令:
$ git push gitee master
这样一来,我们的本地库就可以同时与多个远程库互相同步:
┌─────────┐ ┌─────────┐
│ GitHub │ │ Gitee │
└─────────┘ └─────────┘
▲ ▲
└─────┬─────┘
│
┌─────────────┐
│ Local Repo │
└─────────────┘
码云推送远程库失败
错误信息如下:
解决方法:
ps: 也可以用此命令:git push -f,只有自己一个人用, git push -f表示将目前自己本机的代码库推送到远端,并覆盖,如果远程库只是个人再用可以使用此命令。
push推送
一台电脑管理不同github账户下的项目
情景:
我有company和home两个github账号,company在公司用, home在家里用,最近company账号的项目需要我在家里加班写,为了让home账号可以修改company账号上的远程库,我需要在company账号中添加home账号的ssh key 以便 home账号可以做修改和上传。
问题来了:当我在company账号添加home账号中的ssh key 提示我key已经被使用,无法添加;因为home的ssh key 已经被我添加home的账号中,无法再添加到别的账号下。
解放方案:在home账号的电脑下创建多个SSH key 提供给company账号一个ssh key绑定,这样home既可以修改自己的项目也可以修改company的项目。
开始
第一步:配置你的用户信息:(已经配置过请跳至第二步)
命令:
$ git config --global user.name "name" //配置你的账户名字
$ git config --global user.email "email" //配置你的创建github账户的邮箱;
查看已经配置好的用户信息:
$ git config user.name
$ git config user.email
第二步:生成ssh key
这里我先创建一个ssh key,就是默认选项创建的
命令:
$ ssh-keygen -t rsa -C "邮箱名"
创建好后,它会在你安装git目录下创建一个.ssh文件,
找到文件后打开;里面id_rsa.pub文件就是你的ssh key 复制到github上
现在我们创建第二个:
生成ssh key 命令:
$ ssh-keygen -t rsa -C Email
重点来了:
它会提示你输入一个保存key的文件名,这里不要回车,回车会默认创建文件名为 id_rsa,会覆盖我们前面创建的。
输入保存路径或文件名即可,即id_xyd。
成功以后,我们看下.ssh目录下
这个ssh key 就可以提供给别人,用来绑定在github上绑定;这里我提供给company账号绑定。
注意:添加新ssh key时,默认SSH只会读取id_rsa,所以为了让SSH识别新的私钥,需要将其添加到SSH agent。
使用命令:ssh-add ~/.ssh/id_rsa_me
如果报错:Could not open a connection to your authentication agent.无法连接到ssh agent
可执行ssh-agent bash命令后再执行ssh-add命
绑定好了之后,需要在.ssh文件配置 config,如果不配置账号可能会冲突,报错。
如果没有config 文件直接新建;以如下方式配置
# Default GitHub
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
Host git
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
参数:
每个秘钥单独配置一个Host,每个Host要取一个别名,每个Host主要配置HostName和IdentityFile两个属性即可。
1. Host的名字可以取为自己喜欢的名字,不过这个会影响git相关命令,例如:
Host mygithub 这样定义的话,命令如下,即git@后面紧跟的名字改为mygithub
git clone git@mygithub:PopFisher/AndroidRotateAnim.git
2. HostName 这个是真实的域名地址
3. IdentityFile 这里是id_rsa的地址
4. PreferredAuthentications 配置登录时用什么权限认证--可设为publickey,password publickey,keyboard-interactive等
5. User 配置使用用户名
最后关联库的时候git remote add name git@github.com:path/repo-name.git,要修改git@github.com为配置文件config中host选项的信息。
栗子:
我给company的ssh key 是我后面新建的名字为 id_xyd.pub这个,我在host设置的host名字为github-xyd,关联库的时候就需要把前面的git@github.com这个修改为你修改的host名。
修改前:git@github.com:llf-1996/learngit.git
修改后:git@github-xyd:llf-1996/learngit.git 或者github-xyd:llf-1996/learngit.git