@nextleaf
2018-11-08T18:05:56.000000Z
字数 5441
阅读 699
Git
建议使用标准的UTF-8编码(UTF-8 without BOM),避免使用记事本修改项目文件
下载地址 https://git-scm.com/downloads
初始化配置,在命令行或Git Bash中配置你的用户名和密码:
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
在 Windows 系统上,如果要在提交时自动地把回车(CR)和换行(LF)转换成换行(LF),而在检出代码时把换行(LF)转换成回车(CR)和换行(LF),用
git config --global core.autocrlf true
来打开此项功能
在项目根目录下【请确保目录名(包括父目录)不包含中文】使用命令
git init
来初始化版本库
git add
命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件
git add file2.txt file3.jsp file3.xml file4.java mysql.properties
/*可以使用参数-f强制添加*/
示例-添加documentation目录及其子目录下所有*.txt文件的内容:
git add documentation/*.txt
把工作区的所有变化提交到暂存区(不包括被删除的文件)
git add .
git commit -m "提交说明说明"
项目文件修改后,也是通过这两个命令提交修改
git status
命令可以查看仓库当前的状态,如果git status告诉你有文件被修改过,可用git diff [file]
查看修改内容
git log
命令查看修改记录,加上--pretty=oneline
参数可简化输出。(一长串字符代表提交版本号,HEAD指示当前版本)
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】:
已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退,不过前提是没有推送到远程库
删除后只能恢复文件到曾提交的最新版本
git rm test.txt
rm 'test.txt'
远程仓库是指托管在因特网或其他网络中的你的项目的版本库。 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。 与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。
git remote add origin [address]
头一次推送,使用-u
参数:git push -u origin master
以后:git push origin master
master是分支名称
克隆远程库:git clone [address]
git checkout -b dev dev是分支名,加上-b参数表示创建并切换到,相当于以下两条命令
git branch dev
git checkout dev
git branch命令会列出所有分支,当前分支前面会标一个*号
还可以使用已有标签来创建分支git checkout -b [branchname] [tagname]
切换分支:
git checkout [branchname]
git merge 命令用于合并指定分支到当前分支:
git merge dev dev分支的工作成果合并当前分支上
删除分支,参数d为大写时,强制删除:git branch -d [branchname]
文件又冲突时,合并会失败并提示冲突文件,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
上】
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内容也删了
要查看远程库的信息,用git remote
,
或者用git remote -v
显示更详细的信息(如果没有推送权限,就看不到push的地址)
在本地创建和远程分支对应的分支:
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]
。
Rebase只对尚未推送的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作】
git log --graph --pretty=oneline --abbrev-commit 查看分支合并图
git rebase 把分叉的提交历史“整理”成一条直线,看上去更直观
git push origin branch-name 把本地分支推送到远程
git log --graph --pretty=oneline --abbrev-commit
Git 使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)
一个轻量标签很像一个不会改变的分支(分支可以移动,标签不能移动),它只是一个特定提交的引用(指向某个commit的指针);而附注标签是存储在 Git 数据库中的一个完整对象。 它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证。
发布一个版本时,通常先在版本库中打一个标签(tag),将来取某个标签的版本,就是把那个打标签的时刻的历史版本取出来
git tag
首先,切换到需要打标签的分支上(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]
git tag -d [tagname]
如果远程仓库也有要删除:先删除本地,再
git push origin :refs/tags/[tagname]
默认情况下,git push
命令并不会传送标签到远程仓库服务器上
需要显式地推送(某个)标签:
git push origin [tagname]
把所有不在远程仓库服务器上的标签全部传送到那里:
git push origin --tags
在特定的标签上创建一个新分支:
git checkout -b [branchname] [tagname]
(先注册并登录一个GitHub账号)
在GitHub上,可以任意Fork开源仓库;
自己拥有Fork后的仓库的读写权限;
可将Fork后的仓库clone到本地;
本地修改后往自己的仓库推送;
在GitHub上,可以推送pull request给官方仓库来贡献代码。
github添加-新建-SSH key:
1.使用git或GitHub Desktop生成密钥对,
例如:
ssh-keygen -t rsa -b 4096 -C "nextleaf@outlook.com"
2.访问https://github.com/settings/keys,点击右上角new SSH key按钮
3.取个名字,名字一般是生成密钥对时填写的邮件地址,粘贴公钥内容,比如id_rsa.pub
的。
4.点击add SSH key
按钮。
国内使用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
在工作区的根目录下创建一个特殊的.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 找到它.
以上Git教程摘自廖雪峰的官方网站 https://www.liaoxuefeng.com/
若发现教程有误,可参考Git官方在线文档 https://git-scm.com/book/zh/v2
另一个教程易百教程。