Git使用总结
开发策略
- 在实际开发的时候一定要在分支上开发,修复问题,开发完成之后再合并到主分支(master)上,这样可以保证在不损坏主分支的情况下删除或者撤销内容
解决冲突
冲突产生
-
假设现在有一个
master分支
,其中有一个提交之后的文件demo.txt
,那么我们使用git checkout -b dev
创建一个新的分支并且切换到这个dev分支-
echo chenjiabing >> demo.txt
:在文件的末尾追加一个文件 -
git add file.txt
: 添加到暂存区 -
git commit -m "this is at dev
:提交 -
git checkout master
: 切换到主分支 -
echo 陈加兵 >>demo.txt
: 切换到主分支,在主分支中在文件的末尾追加陈加兵
,(这里一定要在文件末尾,因为在dev分支中修改的位置就是文件末尾) -
git add demo.txt
: 添加到暂存区 -
git commit -m "this is at master"
: 提交 -
git merge dev
:快速合并分支dev到master分支上,那么现在将会出现版本冲突的问题,不能合并成功。此时的demo.txt
的文件内容为:
Git is a distributed version control system. Git is free software distributed under the GPL. Git has a mutable index called stage. Git tracks changes of files. <<<<<<< HEAD 陈加兵 ======= chenjiabing >>>>>>> dev
-
冲突解决
-
此时在
master分支
中修改demo.txt
中的内容,直到满意为止即可-
git add demo.txt
: 添加 -
git commit -m "this is finally"
:提交
-
分支管理策略
- 通常,合并分支时,如果可能,Git会用
Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。 - 如果要强制禁用
Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。 git merge --no-ff -m "merge with no-ff" dev
Bug分支(git stash)
- Bug分支
-
git stash
将当前的工作现场存储起来 -
git stash list
: 列出所有的工作现场 -
git stash pop
: 回复当前分支的工作现场,并且还删除了stash中的内容
添加公钥到Github中
-
如果你没有在git中配置邮箱和用户名,那么需要先配置
git config --global user.name "CSDN id"
git config --global user.email "your email"
cd ~/.ssh
: 进入主目录的ssh文件夹
中,查看是否已经存在秘钥文件id_rusa.pub
,如果不存在,那么需要生成秘钥ssh-keygen -t rsa -C "your email"
: 生成公钥此时在
~/.ssh
文件夹下就有了id_rusa.pub
文件夹,那么将其中的内容全部复制到github中的SSH中-
注意: 添加远程仓库的时候一定要使用ssh形式,否则将会要求输入密码
git remote add git@github.com:chenjiabing666/LearnGit.git
远程仓库的使用
常用命令
-
git clone git@github.com:chenjiabing666/LearnGit.git
:直接clone远程仓库到本地仓库,此时的本地仓库也有了push的权利,不过只能看到一个主分支master
,但是这个远程仓库还有dev
分支和Bug
分支-
git checkout -b dev orgin/dev
: 直接在本地创建一个分支dev并且和远程仓库的分支关联起来,那么就可以获取远程dev分支上的文件了
-
-
git remote
: 查看远程仓库的名称,这个只显示名称,使用git clone
的方法关联远程仓库,默认的名字为orgin
-
git remote -v
: 显示远程仓库的名称和链接 -
git remote add shortName url
: 添加一个新的远程仓库git remote add learn git@github.com:chenjiabing666/LearnGit.git
-
git remote rename 旧名称 新名称
: 修改远程仓库的名称git remote rename orgin demo
-
git remote remove 名称
: 删除远程仓库git remote remvoe orgin
-
git push 仓库名称 [分支名称]
: 将提交的文件推送到远程仓库-
git push orgin
: 将文件推送到远程仓库的主分支master
- 假设我们新建了一个
dev分支
使用命令git checkout -b dev
,那么我们需要将这个dev分支推送到远程仓库中的dev分支
上,使用git push orgin dev
。需要注意的是必须在当前的本地仓库的dev分支才能推送,并且这个本地仓库的名称要和远程仓库一样
-
-
git pull
: 从远程仓库中拉取本地仓库分支中没有的文件并且合并到当前分支- 假设小明在
master分支
上提交了一个file.txt
文件,但是小李的本地仓库中并没有file.txt
这个文件,此时小李就需要从远程仓库中把这个文件拉取到自己的本地仓库的master分支上-
git checkout master
: 切换到主分支 -
git pull
: 拉取远程仓库的最新文件
-
- 假设小明在
远程分支
推送分支
-
git push 名称 分支名称
: 推送分支到远程仓库中-
git push orgin Bug
: 推送本地的分支Bug推送到远程仓库中,那么仓库中默认的分支名就是Bug
-
- 对于一些需要合作完成的分支需要推送到远程仓库,并不是所有的分支都需要推送到远程仓库的
抓取分支
- 在多人协作完成项目的时候,都需要向
主分支master
和dev分支
上面推送各自的修改 - 我们使用
git clone
一个远程仓库的时候,默认情况下只能看到master
分支,我们可以使用git branch
查看分支。此时我们需要在dev
分支上面操作,那么就必须将远程仓库中的dev分支创建到本地,我们可以使用git checkout -b dev orgin/dev
,那么远程仓库的中的dev分支就创建到本地了,那么此时我们就可以在dev分支上面操作了-
git push orgin dev
: 修改完成之后推送到远程仓库中
-
- 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
- 如果远程仓库中有一个
demo分支
,本地也有一个demo
分支,但是这个本地的demo分支
并不是使用git checkout -b demo orgin/demo
检出的,而是直接创建的,那么我们此时需要使用git pull
拉取远程仓库中demo分支中的文件到本地的demo分支就会发现出现错误,因为没有与远程的demo分支关联,此时我们就需要使用git branch --set-upstream demo orgin/demo
- 如果远程仓库中有一个
总结
因此,多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin <branch-name>
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。
标签的使用
创建标签
git tag v1.0
: 在当前分支上添加一个标签git tag -a v1.0 -m "备注信息"
: 添加一个标签并且备注信息git tag
: 列出当前分支上面的所有标签
操作标签
-
git tag -d v1.0
: 删除指定的标签 -
git push origin v1.0
: 推送标签到远程仓库,因为标签的创建不会自动推送到远程,必须手动推送 -
git push orgin --tags
: 一次性推送全部的标签
删除远程标签
- 先删除本地标签 :
git tag -d v1.0
- 使用
push
删除远程标签 :git push orgin :refs/tags/v1.0
添加所有文件
git add -A
- 之后直接提交即可 :
git commit -m ""