版本控制系统Git
Git的配置GitHub账户
可以为每个存储库设置Git用户名和邮箱,也可以使用全局用户名和邮箱
全局配置:
打开终端(Windows下为Git Bash)
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
查看用户名git config --global user.name
查看邮箱git config --global user.email
为每个存储库设置Git用户名:
打开终端(Windows下为Git Bash)
将当前工作目录更改为您想要配置与您的Git提交相关联的名称的本地存储库
git config user.name "某个存储库的Git用户名"
git config user.email "某个存储库的Git邮箱"
查看用户名git config user.name
查看邮箱git config user.email
2.使用git生成密钥对,(生成过程会让你指定密钥对的存放路径以及提示输入安全密码,按回车默认存放到~/.ssh/,安全密码可为空,直接回车)例如:
ssh-keygen -t rsa -b 4096 -C "[email protected]"
建议使用标准的UTF-8编码(UTF-8 without BOM),避免使用记事本修改项目文件
Git安装
下载地址 https://git-scm.com/downloads
初始化配置,在命令行或Git Bash中配置你的用户名和密码:
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
在 Windows 系统上,如果要在提交时自动地把回车(CR)和换行(LF)转换成换行(LF),而在检出代码时把换行(LF)转换成回车(CR)和换行(LF),用
git config --global core.autocrlf true
来打开此项功能
Git使用
1.创建版本库(.Git)
在项目根目录下【请确保目录名(包括父目录)不包含中文】使用命令
git init
来初始化版本库
2.把文件添加到版本库
2.1把文件(单个或多个,单次或多次)添加到仓库,在工作区(项目目录)下执行命令
git add
命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件
git add file2.txt file3.jsp file3.xml file4.java mysql.properties
/*可以使用参数-f强制添加*/
示例-添加documentation目录及其子目录下所有*.txt文件的内容:
git add documentation/*.txt
把工作区的所有变化提交到暂存区(不包括被删除的文件)
git add .
2.2把添加的文件提交到仓库,在工作区下执行命令
git commit -m "提交说明说明"
项目文件修改后,也是通过这两个命令提交修改
git status
命令可以查看仓库当前的状态,如果git status告诉你有文件被修改过,可用git diff [file]
查看修改内容
git log
命令查看修改记录,加上--pretty=oneline
参数可简化输出。(一长串字符代表提交版本号,HEAD指示当前版本)
3.回退版本
git reset --hard HEAD^ 回退到上一个版本
git reset --hard [commit id] 恢复到指定版本
git reflog 查看命令历史纪录,以便恢复到指定版本
git checkout -- file 让file这个文件回到最近一次git commit或git add时的状态
git reset HEAD [file] 可以把暂存区file的修改撤销掉(unstage),重新放回工作区
【场景1】:
当你改乱了工作区某个文件的内容(或误删文件),想直接丢弃工作区的修改时,用命令git checkout -- [file]
。
【场景2】:
当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD [file]
,就回到了场景1,第二步按场景1操作。
【场景3】:
已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退,不过前提是没有推送到远程库
4.从版本库中删除文件
删除后只能恢复文件到曾提交的最新版本
git rm test.txt
rm 'test.txt'
5.远程仓库
远程仓库是指托管在因特网或其他网络中的你的项目的版本库。 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。 与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。
6.添加远程库
git remote add origin [address]
7.把分支的所有内容推送到远程库上
头一次推送,使用-u
参数:git push -u origin master
以后:git push origin master
master是分支名称
克隆远程库:git clone [address]
8.创建分支
git checkout -b dev dev是分支名,加上-b参数表示创建并切换到,相当于以下两条命令
git branch dev
git checkout dev
git branch命令会列出所有分支,当前分支前面会标一个*号
还可以使用已有标签来创建分支git checkout -b [branchname] [tagname]
切换分支:
git checkout [branchname]
9.合并分支
git merge 命令用于合并指定分支到当前分支:
git merge dev dev分支的工作成果合并当前分支上
删除分支,参数d为大写时,强制删除:git branch -d [branchname]
10.解决冲突
文件又冲突时,合并会失败并提示冲突文件,git status
也可以告诉我们冲突的文件
修改后,再把文件添加和提交
用git log --graph
命令可以看到分支合并图
通常合并分支时,如果可能,Git会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息
强制禁用Fast forward模式,Git会在merge时生成一个新的commit,合并后的历史有分支,能看出来曾经做过合并
git merge --no-ff -m "描述描述" dev
--no-ff参数,表示禁用Fast forward
合并后,可用git log
查看分支历史
【master
分支应当是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;干活都在其他分支上,完善后再--no-ff
合并到master
上】
11.Bug分支
git stash
可以把当前工作现场“储藏”起来,等以后恢复现场(git stash pop
)后继续工作
【场景】:dev分支开发到一半,master
分支有bug要修复
示例步骤:
git stash
保存现场
git checkout master
切换到master
git checkout -b issue-101
创建并切换bug分支issue-101
修复,提交
git checkout master
切换到master
git merge --no-ff -m "修复bug 101" issue-101
合并到master
删除issue-101分支
git checkout dev
切换到dev分支
git stash list
查看工作现场列表
git stash apply stash@{0}
恢复指定现场,恢复后stash内容并不删除,可以用git stash drop
来删除
另一种方式是用git stash pop
,恢复的同时把stash内容也删了
12.多人协作
要查看远程库的信息,用git remote
,
或者用git remote -v
显示更详细的信息(如果没有推送权限,就看不到push的地址)
12.1抓取分支(git pull)
在本地创建和远程分支对应的分支:
git checkout -b dev origin/dev
建立本地分支和远程分支的关联:
git branch --set-upstream-to=origin/[branchname] [branchname]
把分支推送到远程:
git push origin dev
推送出现冲突时,先用git pull
把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送
如果git pull
也失败了,需要定本地dev分支与远程origin/dev分支的链接(关联),
git branch --set-upstream-to=origin/dev dev
再git pull
,此时若出现合并冲突,需要手动解决,解决后,提交,再push
【多人协作的工作模式通常是这样的】:
首先,可以试图用
git push origin branch-name
推送自己的修改;
如果推送失败,则可能因为远程分支比你的本地更新,需要先用git pull
试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin [branch-name]
推送就能成功!
如果git pull
提示'no tracking information...',则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to [branchname] origin/[branchname]
。
13.Rebase
Rebase只对尚未推送的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作】
git log --graph --pretty=oneline --abbrev-commit 查看分支合并图
git rebase 把分叉的提交历史“整理”成一条直线,看上去更直观
git push origin branch-name 把本地分支推送到远程
git log --graph --pretty=oneline --abbrev-commit
14.标签管理
Git 使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)
一个轻量标签很像一个不会改变的分支(分支可以移动,标签不能移动),它只是一个特定提交的引用(指向某个commit的指针);而附注标签是存储在 Git 数据库中的一个完整对象。 它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证。
发布一个版本时,通常先在版本库中打一个标签(tag),将来取某个标签的版本,就是把那个打标签的时刻的历史版本取出来
14.1列出标签(以字母顺序列出标签)
git tag
14.2创建标签
首先,切换到需要打标签的分支上(git checkout [branchname]
)。
创建一个附注标签最简单的方式是当你在运行 tag
命令时指定 -a
选项
git tag -a v1.4 -m 'my version 1.4'
-m
选项指定了一条将会存储在标签中的信息
使用 git show [tag]
命令可以看到标签信息与对应的提交信息
轻量标签,只需要提供标签名字:
git tag [tag-name]
对过去的提交打标签
git log --pretty=oneline --abbrev-commit
git tag -a v1.2 [commit-id]
14.3删除标签
git tag -d [tagname]
如果远程仓库也有要删除:先删除本地,再
git push origin :refs/tags/[tagname]
14.4共享标签
默认情况下,git push
命令并不会传送标签到远程仓库服务器上
需要显式地推送(某个)标签:
git push origin [tagname]
把所有不在远程仓库服务器上的标签全部传送到那里:
git push origin --tags
在特定的标签上创建一个新分支:
git checkout -b [branchname] [tagname]
15.第三方托管
15.1使用GitHub
(先注册并登录一个GitHub账号)
在GitHub上,可以任意Fork开源仓库;
自己拥有Fork后的仓库的读写权限;
可将Fork后的仓库clone到本地;
本地修改后往自己的仓库推送;
在GitHub上,可以推送pull request给官方仓库来贡献代码。
github添加-新建-SSH key:
1.使用git或GitHub Desktop生成密钥对,
例如:
ssh-keygen -t rsa -b 4096 -C "[email protected]"
2.访问https://github.com/settings/keys,点击右上角new SSH key按钮
3.取个名字,名字一般是生成密钥对时填写的邮件地址,粘贴公钥内容,比如id_rsa.pub
的。
4.点击add SSH key
按钮。
15.2使用码云
国内使用GitHub时,经常会访问速度慢,码云则没有这个问题。
码云添加SSH key步骤与github添加的步骤类似
git remote -v
查看远程库信息(查看是否已关联远程库)
删除已有的GitHub远程库:
git remote rm origin
再关联码云的远程库(注意路径中需要填写正确的用户名):
git remote add origin [url]
也可以既关联GitHub,又关联码云:
先删除已关联的名为origin的远程库:
git remote rm origin
关联GitHub的远程库:
git remote add github [url]
再关联码云的远程库:
git remote add gitee [url]
用git remote -v
查看远程库信息,可以看到两个远程库
如果要推送到GitHub,使用命令:
git push github master
如果要推送到码云,使用命令:
git push gitee master
16.忽略特殊文件
在工作区的根目录下创建一个特殊的.gitignore
文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件
如:
# Compiled class file
*.class
# Log file
*.log
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# Windows
Thumbs.db
ehthumbs.db
Desktop.ini
GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表,你可以在 https://github.com/github/gitignore 找到它.
17.配置命令别名
参见这里
以上Git教程摘自廖雪峰的官方网站 https://www.liaoxuefeng.com/
若发现教程有误,可参考Git官方在线文档 https://git-scm.com/book/zh/v2
另一个教程易百教程。