Git¶
场景¶
在windows上会做一些调试代码的工作,然后,要同步到github上去。 在学习AI时,程序真正的运行都在ubuntu机器上(GPU)
git for windows¶
远程仓库¶
添加远程仓库¶
在本地仓库(.git目录)中可以记录有多个远程仓库
$git clone 仓库地址 # 被克隆的那个仓库自动记录为远程仓库,并且取名为origin
$git remote add 仓库标识 仓库地址 # 使用github上仓库的SSH地址,而不是HTTPS地址。
修改远程仓库¶
1 2 | $git remote remove origin #首先删除原来的
$git remote add xxx
|
版本¶
版本库¶
版本库是.git
提交版本¶
git add和git commit的实际作用是和Git的结构设计紧密相关,详见廖雪峰的工作区和暂存区
这篇文章解答了我的几个疑惑:
- 只是修改的文件,也需要先add,再commit,而不是可以直接commit
- 可以执行多个add,最后执行一个commit
- add和commit的操作都是针对本地git仓库的
- Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
- commit后“暂存区”就空了
commit背后的细节¶
- 一次commit就是一个版本,在版本库中形成了时间线,如下图所示:
- HEAD指向当前commit的版本。
- 一个版本有两个基本属性,commit-id和commit message
HEAD指针&分支指针¶
HEAD指针&分支指针是Git中非常重要的概念
- HEAD指针就是.git/HEAD文件
- 分支指针就是.git/refs/heads目录下分支同名文件,文件内容就是某个commit id
$ cat develop caada2821ae7adfec482c8f9f0eca21c764a6425
标签¶
tag和commit的关系¶
发布一个版本(commit)时,我们通常先在版本库中打一个标签(tag),标签也是版本库的一个快照。
tag默认是打在HEAD指向的版本上的,当然,也可以打在指定的commit-id版本上。
git管理的文件的状态¶
从来没有add/commit的文件:Untracked files
add后:Changes to be committed
commit后:nothing to commit, working tree clean
commit后又修改的:changes not staged for commit
撤销修改¶
参考了https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001374831943254ee90db11b13d4ba9a73b9047f4fb968d000
- 修改后没有执行add,使用命令把工作目录的修改的文件还原。
$ git checkout – readme.txt
- 修改后执行了add
从远程仓库同步代码¶
当要从远端仓库获取代码时,pull, clone, fetch到底使用哪一个呢?
pull¶
PULLis a high-level request that runs ‘fetch’ then a ‘merge’ by default,
1 2 3 4 5 | %> git checkout localBranch
%> git pull origin master
%> git branch
master
* localBranch
|
The above will merge the remote “master” branch into the local “localBranch”.
如果pull时,merge出错的解决办法请参考:https://help.github.com/cn/github/collaborating-with-issues-and-pull-requests/resolving-a-merge-conflict-using-the-command-line#competing-line-change-merge-conflicts
fetch¶
$ git fetch [remote-name][分支名]
- 执行这个命令时要注意,本地哪里来的remote-name记录,途径:
1)$git remote add手工添加
2)之前执行过$git clone,自动取名的
2. 这个命令执行完成后,它们将被保存在本地的 “remote-name /分支名” 分支, 可以通过$git branch -a查看
clone¶
$ git clone <版本库的网址>
在一个目录下执行$git clone操作后完成了以下操作:
- 新建了一个远端仓库版本库同名的子目录, 如果要指定不同的目录名,可以将目录名作为git clone命令的第二个参数,$ git clone <版本库的网址> <本地目录名>
- 不需要执行$git init,在新建的子目录下就会有.git文件夹
- 这个远端仓库可以使任意的github上的仓库,不必先folk到自己账户下,然后在执行clone
- 自动给远端仓库取名为“origin”
- 这个命令可以相当于执行了如下两个命令
$git remote add $git fetch
分支¶
查看本地和远程分支¶
$ git branch -a
创建分支¶
$ git branch dev
创建并切换分支¶
$ git switch -c dev
删除¶
$git branch -d <name>