常用远端代码库网站有
- github(全球最大的代码库,英文)
- gitlab(公司常用的仓库,通常是自己部署的,中英)
- gitee(码云,国产代码库,中文)
这里主要讲解github的远端仓库配置方法。
免密配置推送
- 创建github账号。
- 在本地执行命令
ssh-keygen -t rsa -b 4096 -C "邮箱地址",生成ssh密钥和公钥。 - 在本地用户目录下找到
.ssh目录,win10系统的默认目录是C:\Users\Lansiny\.ssh。 - 在
.ssh目录下,找到id_rsa.pub文件,这里记录公钥。 - 点击github右上角的用户图标,打开
settings页面,找到SSH and GPG keys选项。 - 在
SSH Keys位置添加公钥,粘贴id_rsa.pub的内容,如果不填Title,会自动填上全局配置的邮箱。 - 点击
Add SSH key,配置完成。
克隆
git clone <远端地址> <本地目录>,可以从远端仓库把项目下载到指定的本地目录下。
git clone <远端地址>,如果不填本地目录参数就会下载到当前目录下。
克隆完成后,git会为你刚才克隆的仓库动自动设置一个名为origin的远端仓库配置,地址为你刚才克隆的仓库的地址。并且会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支,或者其他名字的默认分支。
远端仓库配置
如果是先在本地初始化的仓库,则需要指定远端仓库路径才可推送和拉取。
使用git init 初始化的本地仓库并没有远端仓库路径,需要手动添加。
git remote add <仓库名称> <仓库路径>,指定一个远端仓库的别名,并配置路径,本文的远端仓库名称是origin。
git remote -v,配置好远端地址的仓库或克隆下来的仓库可以使用这个命令查看已配置的所有远端仓库信息。
git remote show或git remote,可以列出所有远端仓库名称。
git remote show <远端仓库名称>,查看某个远端仓库的详细信息。
git remote rm <要删除的远端仓库名称>,删除指定的远端仓库配置,这里只是删除本地配置,并不影响远端仓库。rm也可以写成remove。
git remote rename <要改名的仓库名称> <新的仓库名称>,更改本地配置的远端仓库的名称,并不影响远端仓库。
更改远端仓库名称之后,远程跟踪分支名字也会更改,删除远端仓库之后,远程跟踪分支以及配置信息也会删除。
分支管理
初始化仓库时不能马上创建分支,分支以提交记录为节点,至少提交一次才可以创建分支。
协作开发极其依赖git的分支功能。
git branch <分支名称>,创建新分支。
git switch <分支名称>, 切换到指定分支。
git checkout -b <分支名称>,创建新分支,并切换到新分支,这是上面两个命令的简写。
git branch,查看所有分支, 带星号的是当前所处分支。
git branch -d <要删除的分支名称>,删除本地分支, 假如这个分支未合并,则无法删除。
git branch -D <要删除的分支名称>,强制删除本地分支, 无论是否已合并。
推送
git push <远端仓库名称> <要推送的本地分支名称>, 把本地分支推送到远端仓库。
注意,在git创建新的仓库时,可以在页面中选择一些初始化配置,如README.md、 .gitignore、LICENSE,如果有初始化配置,则需要先拉取一次才可以进行推送。如果是空仓库,可以直接推送。
第一次推送时可能会报错,会告诉你没有指定上游分支(跟踪分支)。
git push --set-upstream <远端仓库名称> <要推送的本地分支名称>,推送并指定远端仓库的同名分支为上游分支。
git push,上一条命令执行之后,就可以进行快捷推送,把当前分支推送到上游分支。
如果本地分支与远端分支名字不同,需要用git push <远端仓库名称> <本地分支名称>:<远端分支名称>,通常是把本地dev分支推送到远端master分支。
git push <远端仓库名称> --delete <要删除的分支名称>,删除指定远端仓库的指定分支。
获取和拉取
如果是协作开发,往往会出现两个人在同一时间克隆的仓库,各自更改之后,然后不同时间提交上去,提交会失败,这时候就需要同步远端仓库和本地仓库,再进行提交。也就是说,如果远端有新的推送,则需要处理合并冲突,如果没有新的推送,则不需要拉取和处理合并冲突。同步远端仓库主要有以下两个命令。
git fetch <远端仓库名称>,叫获取或抓取。可以获取你所没有的远端仓库的数据,执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。克隆后,执行这个命令可以抓取克隆后远端仓库新推送的所有工作,或抓取距上一次抓取后新推送的所有工作。这个命令并不会自动合并,只是把数据从远端仓库下载下来。
git pull <远端仓库名称> <要拉取的远端分支名称>,叫拉取。拉取origin仓库的master分支,与本地分支合并。如果同一文件的同一地方出现更改,那么就会产生冲突,无法合并。
通常是,克隆仓库完成后,使用git fetch 获取仓库信息,内容更改完成后,使用git pull,同步分支的内容,然后再git push。
分支合并和冲突处理
git merge <需要合并的分支名称>,可以把指定分支合并到当前分支。如果当前分支比需要合并的分支领先一次或多次提交,则大概率需要处理冲突。因为可能会同时更改同一个文件的同一处。此时git会暂停,并等待你去解决合并产生的冲突。
使用git status命令可以查看因为冲突而未合并的文件。
<<<<<<< HEAD:test.txt表示当前分支的test.txt文件的冲突内容。
=======,使用这个符号把当前分支与要合并的分支的冲突内容分隔开来。
>>>>>>> dev:test.txt表示dev分支的test.txt文件的冲突内容。
处理完冲突后,要把 <<<<<<< 、======= 、和 >>>>>>>这些标记删除,然后使用git add <文件名>命令来标记这个文件冲突已解决。
退出合并工具之后,Git 会询问刚才的合并是否成功。 如果你回答是,git会暂存那些文件以表明冲突已解决,可以再次使用git status命令检查所有冲突是否都已解决。