Git基本操作之远程仓库下载与保存、本地仓库初始化并推送
对Git不熟悉的同学可以先看一下简明指南,了解其中的基本概念和过程。
1. 使用git下载GitHub项目中指定分支代码
一般来讲
git clone -b <branch> <remote_repo>
以下面的内容为例
git clone -b release https://github.com/OpenImageIO/oiio.git
此处的 -b 表示要从branch上git clone,release 表示具体的分支名称,https://github.com/OpenImageIO/oiio.git 是code所在源码的git仓库地址,是所有该项目中分支共用的地址(不存在某个branch仓库地址的说法)。
根据说明:
The release branch is very stable and promises to never break back-compatibility with APIs or linkage within that release. The master branch is where new development happens; it tends to be very solid code but its APIs may change at any time.
我找到自己想下载的代码该代码位于 <>Code 下面的 Branch: release 中,如下图所示,前面有 √ 标志的即是当前选择的分支。
然后复制git仓库地址,如下图所示。
最后在终端输入 git clone -b release https://github.com/OpenImageIO/oiio.git 回车即可得到所需分支。
2. 使用git将下载的源码保存成指定文件名
git clone https://github.com/YoYo000/MVSNet.git mvsnet
在 git 远程仓库的后面直接添加保存到本地之后的文件名即可。比如上面我将 MVSNet 源码保存成 mvsnet 源码,下载之后查看效果,就相当于 git clone https://github.com/YoYo000/MVSNet.git ,然后再 mv MVSNet mvsnet 。
3. 本地初始化项目并推送到远程仓库
1 echo "# hello" >> README.md 2 git init 3 git add README.md 4 git commit -m "first commit" 5 git remote add origin https://github.com/username/reponame.git 6 git push -u origin master
其中,对于每一条命令解释如下:
3.1 新建文件夹,创建自定义源文件,然后进入需要建仓库的文件夹路径,输入下面的命令
$ git init
该命令会在工作目录创建一个 .git 目录用于存放项目的版本历史、配置文件等。
如果创建仓库时需要指定项目名称,该命令可以添加可选字段
$ git init [git_name]
此时将在工作目录下创建一个名为 git_name 的文件夹,而将 .git 目录存放在该文件夹下。
3.2 自定义添加文件
$ git add [options] [files]
1 . 匹配所有文件 2 -v, --verbose be verbose 显式详细过程 3 -i, --interactive interactive picking 交互式选择要添加的对象 4 -f, --force allow adding otherwise ignored files 强制允许将其他忽略的文件也包含进来 5 -u, --update update tracked files 更新所有改变的文件,即提交所有变化的文件 6 -A, --all add changes from all tracked and untracked files 提交已经修改和被删除的文件,不包括新的文件
3.3 对要提交的文件添加注释
git commit
主要是将暂存区里的改动提交到本地版本库。每次使用 git commit 命令都会在本地版本库生成一个40位的哈希值,这个哈希值也叫 commit-id,在版本回退时非常有用,它相当于一个快照,可以在未来的任何时候通过与 git reset 的组合命令回到这里。
git commit -m ‘message’
-m 参数表示可以直接输入后面的 “message”,不加此参数不能直接输入 “message”,而是调用一个编辑器(一般是 vim)来让你输入。 message 即是我们用来简要说明这次提交的语句。
git commit -am ‘message’
-a 参数可以将所有已跟踪文件中的执行修改或删除操作的文件都提交到本地仓库,即使它们没有经过 git add 添加到暂存区。注意:新加的文件是不能被提交到本地仓库的。
3.4 添加远程仓库
git remote add origin https://github.com/username/reponame.git
在本地仓库添加一个远程仓库,并将本地的 master 分支跟踪到远程仓库分支。(也就是说在我们往远程仓库推送代码之前,要保证该仓库已经存在,一般是在github网站上手动新建一个,当然也有直接从终端新建的操作,下文有介绍。)
在 GitHub 上 git 仓库建立之初会有一个默认的 master 分支,当然如果我们建立了其他分支,也可以用同样的方法进行跟踪。
此外
git remote
不带参数时,会列出已经存在的远程分支。
git remote -v
v是 verbose 的缩写,此时会列出详细信息,在每一个名字后面列出其远程 url ,对应其克隆地址。
3.5 推送本地分支到远程仓库
git push -u origin master
如果远程分支被省略,则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
origin 实际上是远程仓库的一个名称,通过容易记忆的名称来代替仓库的URL地址,便于使用,另外如果使用 git clone 命令来克隆一个远程仓库,那么远程仓库名称会默认为 origin。
git push -u origin master 命令中 -u 是 --set-upstream 参数的简写形式,一般用于在本地新建了一个分支之后想将其同步到远程仓库时,执行 git push 指令加上 -u 参数就建立了一个本地新建分支与远程分支之间的映射关系,这样在之后执行 git pull 时才可以将远程仓库中同名分支上的修改 merge 到本地当前分支中。
ps. git 使用过程出现如下问题
Please make sure you have the correct access rights and the repository exists.
解决方法如下:
① 重新设置用户名和邮箱
$ git config --global user.name philleer $ git config --global user.email phillee2016@163.com
② 删除 .ssh文件夹下的 know_hosts
搜索C盘,找到.ssh文件夹(C:\Users\PhilLee),进入文件夹,删除know_hosts文件。一般会在C盘用户用户名文件夹下。
③ 重新生成密钥
$ ssh-keygen -t rsa -C philee2016@163.com
这时系统会自动在.ssh文件夹下生成两个文件:id_rsa 和 id_rsa.pub,用记事本打开id_rsa.pub,复制全部内容
④ 在GitHub上登录账户,进入设置
将复制的内容粘贴到Key那一栏,点击Add SSH key。
⑤ 此时输入下面的命令
$ ssh -T git@github.com
会出现下面的结果
The authenticity of host 'github.com (13.229.188.59)' can't be established. RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'github.com,13.229.188.59' (RSA) to the list of known hosts. Hi philleer! You've successfully authenticated, but GitHub does not provide shell access.
至此就算成功了,可以正常使用了。
实验效果如下
$ git push -u origin master Warning: Permanently added the RSA host key for IP address '52.74.223.119' to the list of known hosts. Enumerating objects: 7, done. Counting objects: 100% (7/7), done. Delta compression using up to 4 threads. Compressing objects: 100% (5/5), done. Writing objects: 100% (7/7), 2.04 KiB | 521.00 KiB/s, done. Total 7 (delta 0), reused 0 (delta 0) To github.com:philleer/coding.git * [new branch] master -> master Branch 'master' set up to track remote branch 'master' from 'origin'.
===============
@2024-02-04更新
remote: Support for password authentication was removed on August 13, 2021. remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication. fatal: Authentication failed for 'https://github.com/philleer/gittest.git/'
GitHub在2021.08.13之后不再支持通过登录帐号时的密码直接验证了,这时我们需要再添加一步操作。
点击头像,进入设置,开发者设置界面
在该界面选择tokens选项,新生成一个token
配置好备注名、过期时间、以及权限范围,点击生成
在跳转的界面可以看到新生成的token明文,点击copy。
记得保存一下这份拷贝,因为只能明文看到一次,这时候用刚刚拷贝作为push时的密码就可以愉快地使用啦。
(操作步骤真是越来越繁琐了...)
(完)
参考资料
[1] git下载代码遇到的‘Please make sure you have the correct access rights and the repository exists’问题
[2] 廖雪峰的官方网站——添加远程库