【参考】http://www.cnblogs.com/schaepher/p/5561193.html
链接里的大拿已经把git的教程写的很详细了,我提取几条常用的命令备用,下面的命令需要对git有基本的了解,在命令或流程忘记时备用
备注:
1.origin:通常表示远程主机名/远程仓库名(如定义了其他,请用其他名字替代)
2.master:默认分支名(主分支)
3.branchName:代指其他的分支名字,实际使用时请带入真实的分支名字
4.FETCH_HEAD: 是一个版本链接,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本
1、电脑第一次使用git时需要执行的命令:
1.设置用户名(github网站的用户名)
git config --global user.name "你的用户名"
2.设置邮箱 (github网站的邮箱)
git config --global user.email "你的邮箱"
可以在在.gitconfig文件中直接配置
3、生成ssh key(和gitHub进行绑定使用),它会有三次等待你输入,直接回车即可
ssh-keygen -t rsa -C "你的邮箱"
生成的ssh key复制到剪贴板,执行 clip < ~/.ssh/id_rsa.pub或直接根据提示查看路径、打开id_rsa.pub文件复制,在gihub网页上添加key。测试一下吧,执行
ssh -T git@github.com
看是否成功
对于 oschina 的 “码云” ,执行
ssh -T git@git.oschina.net
对于 coding 的 “码市” ,执行
ssh -T git@git.coding.net
2、初始化仓库:init
1.在需要建立仓库的文件夹下右键 点击“Git Bash Here” 弹出窗口输入
git init
会创建一个隐藏的文件夹 .git
3、新建、编辑文档
vi xxx.xx
4、文件的添加、提交:add 、commit 、log、reflog
1.查看文件(数据)的是否被添加追踪
git status
2.添加、追踪文件到仓库缓存空间(stage)(commit 前必须要 add)
添加具体的文件:git add <file>...
添加所有的文件:git add -A
添加结束后可以使用 命令“git status” 查看文件是否已经添加缓存
3.查看文件有哪些变化(+:新添加的 / -:删除的数据)
git diff
4.提交到仓库repository
git commit -m "提交信息/版本备注"
5.查看当前版本及之前的commit记录
git log
带图形指示(查看节点之间的merge情况)
git log --graph
HEAD的变更记录(所有记录)
git reflog
5、撤销当前更改
待测
git checkout -- .
6、版本回滚:reset 、revert
6.1、使用git log 查看commit版本号,复制版本号(不少于7位)
git reset --hard 版本号
执行后git log只能查看当前版本及之前的版本信息,HEAD 是向后移动,之后的版本信息无法查看,相当于时光倒流回之前的时间点。要回到最新的版本,git reflog 命令查看这个HEAD所在的(所有)版本号,提取对应的版本号,再一次执行git reset –hard 版本号命令即可恢复到最新。
7、清除未追踪的文件:clean
删除当前目录下所有没有track过的文件(待测)
git clean -xf
8、中文乱码
如果会显示中文乱码:
git config --global core.quotepath false
执行之后还会乱码
git config --global i18n.commitencoding utf-8
git config --global i18n.logoutputencoding utf-8
请根据需要将后面的 utf-8 替换成你想要的编码。如果是团队项目,请确保所有成员的设置都一致
9、本地Git和Github的建立关联、删除关联、查看仓库信息:remote
1.建立关联:在github网页上的建立仓库,并复制参考地址,HTTPS比较慢,所以推荐使用SSH
git remote add origin 你复制的github仓库地址
2.删除关联:删除名字为origin的远程仓库
git remote rm origin
3.查看仓库信息:查看远程仓库数据
git remote 不带参数时可以参看远程仓库名称
git remote -v 可以查看远程仓库名称和网址
如果github上的仓库已经有数据(添加了README.md 或者 LICENSE), github 会拒绝你的 push ,需要先执行
git pull origin master
将仓库上的数据pull下来后再执行
git push -u origin master
10、git和github数据交互:push、pull / fetch
执行9步骤后以后可以直接
1.push数据到github
1.1.push当前分支到github
git push
1.2.push < branchName >这个分支到github的branchName 上,如果远程分支不存在,则会被新建:git push <远程主机名> <本地分支名>
git push origin branchName
1.3.push < branchName >这个分支到github的branchNameX上,如果远程分支不存在,则会被新建:git push <远程主机名> <本地分支名>:<远程分支名>
git push origin branchName:branchNameX
2.fetch 数据到本地(fetch和pull有那么一点绕,需要花点时间理解,实际使用时也需要花点时间磨合,感知变化)
— 将远程分支的最新内容拉到了本地,但是fetch后是看不到变化的
— 理解fetch,关键是理解FETCH_HEAD,FETCH_HEAD指的是:某个分支在服务器上的最新状态
2.1.不指定分支时通常默认为master分支,更新master的FETCH_HEAD,并没有与本地的分支合并
git fetch origin
or
git fetch origin master
2.2.指定了分支,更新该分支的FETCH_HEAD,只拉取该分支的最新状态,并没有与本地的分支合并,同时也可以测试远程分支branchName是否存在
git fetch origin branchName
2.3.执行2.1或2.2后:checkout到相应的分支,merge 合并,合并后如果出现冲突则手动解决冲突,最后commit
git merge FETCH_HEAD
or
git merge origin/branchName (待测) / git rebase origin/branchName (待测)
2.4.在本地新建一个branchNameX分支,并将远程仓库的branchNamer分支代码下载到本地branchNameX分支(不存在则创建,但不会切换到该分支):git fetch <远程仓库> <远程分支名>:<本地分支名>,
git fetch origin branchName:branchNameX
3.pull 数据到本地
3.1、执行后发现也是不会创建本地分支,数据也是更新到FETCH_HEAD,执行git log可以获取到最新的commit_id,使用reset命令切换到最新版本:git pull <远程主机名> <远程分支名>
git pull origin branchName
3.2、取回远程主机某个分支的更新后再与本地的指定分支合并即会将本地库更新至远程库的最新状态:git pull <远程主机名> <远程分支名>:<本地分支名>
git pull origin branchName:branchNameX
git pull是git fetch和git merge两个步骤的结合,与git pull相比git fetch相当于是从远程获取最新版本到本地,但不会自动merge。如果需要有选择的合并git fetch是更好的选择。效果相同时git pull将更为快捷
备注:测试了几次,如果实际的代码数据并没有变化,可以尝试使用git log查看commit_id,使用reset命令切换到相应的版本
pull和fetch的关系参考:
https://blog.csdn.net/a19881029/article/details/42245955/
https://www.jianshu.com/p/d265f7763a3a
11、分支:建立/切换/查看/删除、分支合并和冲突解决、分支重命名:branch、checkout 、merge
1.git checkout -b 分支名字 = (建立分支)git branch 分支名字 + (切换分支)git checkout 分支名字
建立并切换到分支 :git checkout -b branchName
=
建立分支:git branch branchName
+
切换分支:git checkout branchName
2.查看分支
查看本地分支
git branch
查看远程分支
git branch -r
查看所有分支,远程分支会用红色表示出来(如果你开了颜色支持的话)
git branch -a
git branch -av(带V,可以查看分支信息)
3.删除分支(master(默认分支)无法删除、工作于某分支下时无法删除该分支)
删除本地分支:git branch -d branchName
删除远程分支:法1:git push origin :branchName
删除远程分支:法2:git push origin --delete branchName
4.合并某个分支到现在的所处的分支
git merge 需要被合并的分支名字
合并分支可能会存在冲突、Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
<<<<<<< HEAD
code1[ ... ]
// 这里的代码是当前分支中的代码数据
=======
code2[ ... ]
// 这里的代码是需要被合并的分支中的数据
>>>>>>> branchName
需要手动将上面标记出来的冲突代码数据进行根据需要进行修改,然后执行 git add / commit 命令,完成分支合并。最后删除分支。
使用带参数git log 查看分支合并情况
git log --graph --pretty=oneline --abbrev-commit
链接描述对分支合并冲突解决的方法:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840202368c74be33fbd884e71b570f2cc3c0d1dcf000/
5.分支重命名
git中重命名远程分支,其实就是先删除远程分支,然后重命名本地分支,再重新提交一个远程分支
git push --delete origin branchName (删除远程分支)
git branch -m branchName branchNameNew (重命名本地分支)
git push origin branchNameNew (重新提交一个远程分支)
默认分支是无法删除的,需要把默认分支修改为其他分支才可以删除:修改默认分支步骤:
1.进入 github 中该项目的 Settings 页面;
2.在Brabchs下设置 Default Branch 为其他的分支(例如 master);
2.重新执行删除远程分支命令
12.tag 创建、推送、获取、删除
— tags是branch中的一些小阶段的标记,tag就像是一个里程碑一个标志一个点,branch是一个新的征程一条线;
— tag是静态的,branch要向前走。
— tags它其实是一个独立的分支,或者说是一个不可变的分支.指向特定提交对象的引用,多用于版本发布
https://www.cnblogs.com/senlinyang/p/8527764.html
https://blog.csdn.net/liuchunming033/article/details/52194734
12.1、创建tag
git tag tagname
创建带注释的tag
git tag -a tagname -m "备注信息"
注解:git tag 是打标签的命令,-a 是添加标签,其后要跟新标签号,-m 及后面的字符串是对该标签的注释
12.2、删除tags
git tag -d tagname (本地)
git push origin -d tagname (远程)
git push origin :refs/tags/tagname
注解:就像git push origin :branch_1 可以删除远程仓库的分支branch_1一样, 冒号前为空表示删除远程仓库的tag
12.3、把本地tag推送到远程
git push origin tagname (单个)
git push --tags (多个tags推送)
12.4、获取远程tag
git fetch origin tag tagname
查询本地tag.
git tag (-l)(显示当前所有tag的名称)
git show tagname (显示某个tag的详细信息)
git tag "tagname*"(显示内容和tagname匹配的多个tag)
13、clone
一个空的,干净的文件夹下从github上clone一个分支
13.1、git clone 默认是克隆Head指向的branch,默认是master分支
git clone git@gitlab.xxx.com:xxxxx.git
13.2、单独clone某个指定分支
git clone -b branchName git@gitlab.xxx.com:xxxxx.git
有分支后就可以去获取其他分支了
git branch -a
git checkout -b branchName origin/branchName
作用是checkout远程仓库origin的分支branchName,在本地起名为branchName分支,并切换到本地的branchName分支,其实-b后面的aaa可以随意设置