@SovietPower
2023-06-18T18:34:49.000000Z
字数 14856
阅读 1168
学习笔记
Git是目前世界上最先进的分布式版本控制系统。
Github是用Git做版本控制的代码托管平台。
Git分为工作区、暂存区和版本库。
工作区(workspace, working tree):电脑里保存并直接编辑的目录、文件。
暂存区(staging area, stage, index):commit 前暂存文件的地方,包含着下一次 commit 的所有改动。暂存区就存在.git/index
这个文件中,所以暂存区也叫作索引(index)。
版本库/git 仓库(local repository, repository):就是工作区下的.git
文件夹,但不属于工作区。包含了所有元数据和数据,包括:当前分支,所有本地分支,远程仓库信息,之前所有提交历史,即每次commit
的数据变动。此外:
远程仓库(remote repository):顾名思义。
对象库(object):目录.git/objects
。包含了创建的各种对象及内容。
对工作区修改/添加的文件执行git add
时,git 首先将更新的内容做快照,写入到对象库.git/objects
中的一个新的对象中。
然后,暂存区.git/index
的目录树被更新?记录新文件的时间戳、长度和对应的新对象的 ID。
当执行提交git commit
时,暂存区的目录树写到版本库(对象库)中,当前分支会相应地更新。所以当前分支指向的目录树就是提交时暂存区的目录树。
项目中,每个文件要么是 tracked,要么是 untracked。tracked 表示该文件已经被 git 所管理,git 会跟踪它的增删改操作;untracked 表示文件不被 git 所管理和监控。
git 中 tracked 的文件有3种状态:
每个文件都会经历 modified - staged - commited 的过程。
有GitHub Desktop,Git的配置似乎可以直接对其生效,比如http.postBuffer
。
windows安装:https://git-scm.com/download/win。
linux就sudo apt-get install git
。
windows下 改变git bash默认打开路径
git bash
快捷方式的属性中,删除目标中的--cd-to-home
,将起始位置改为想要默认打开的位置,如E:\Documents\GitHub
。
配置:
Git有一个配置工具git config,用于配置或读取相应的工作环境变量。
环境变量可以放在三个地方:
1./etc/gitconfig
(Linux):系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
2.~/.gitconfig
:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
3. 工作目录中的.git/config
:仅对当前项目生效。每一层配置都会覆盖上层的同变量名配置,如
.git/config
会覆盖/etc/gitconfig
。
Windows上的配置文件有2.3.,即用户主目录下的.gitconfig
和当前工作目录的.git/config
。用户主目录即$HOME
变量指定的目录,一般是C:\Documents and Settings\$USER
或C:\users\$USER
。
用户信息:
配置/查看/取消设置 提交时的用户名称和邮件地址。
添加--global
则为全局配置,否则为当前目录配置。
$ git config --global user.name "SovietPower"
$ git config --global user.email "sovietpower@foxmail.com"
$ git config user.name
$ git config user.email
$ git config --global --unset user.name "SovietPower"
$ git config --global --unset user.email "sovietpower@foxmail.com"
默认编辑器:
Git默认使用的编辑器。windows安装的时候就可选。
$ git config --global core.editor vim
默认差异分析工具:
Git默认在解决合并冲突时使用哪种差异分析工具。
如选择vimdiff:
$ git config --global merge.tool vimdiff
查看配置信息:
查看单个:git config <name>
查看所有:git config --list
重复出现的变量表明它们来自不同配置文件。Git会选择最后一个。
这些信息存储在~/.gitconfig
和/etc/gitconfig
中,也可直接打开查看。
使用一个已有文件夹创建仓库。
命令后可加-h
(简单)或--help
(具体)查看说明。
git init
git init
用于初始化,Git会生成一个.git
目录,该目录包含了Git所需的所有资源元数据。不改变其它数据。
也可指定文件夹:git init <filename>
。
git clone
git clone
从现有的Git仓库中拷贝项目。
克隆仓库到当前文件夹:git clone <repo>
克隆仓库到指定文件夹:git clone <repo> <directory>
如:git clone git://github.com/SovietPower/QQT.git
。
git config
编辑当前仓库配置:git config -e
(会使用默认编辑器打开配置文件)
编辑全局配置:git config -e --global
(同上)
配置提交时的用户名称和邮件地址(当前/全局):
$ git config user.name "SovietPower"
$ git config user.email "sovietpower@foxmail.com"
$ git config --global user.name "SovietPower"
$ git config --global user.email "sovietpower@foxmail.com"
git 中,可以存在很多分支,它们的提交记录构成了一棵树。不同的分支位于不同子树,它们的 LCA 是分支创建的起始点。
每个分支都有一个指针,指向该分支最新的提交。所以当分支提交时,会创建一个新的提交节点,并使分支指针指向它。
例:
$ cat .git/HEAD # 当前分支
ref: refs/heads/master
$ cat .git/refs/heads/master # 当前分支的最新指针
7406a10efcc169bbab17827aeda189aa20376f7f # 提交的哈希值
HEAD 一般指向当前分支(的最新提交)(与当前分支名等价),会随分支的提交而移动。
分支其实只是一次提交的别名,或指向一次提交的指针。所以 HEAD 可指向某一次提交记录,而不是具体分支,此时称它处于游离/分离状态 (detached)。这种状态做出的修改,最终需要创建一个新分支继承,然后合并。见 使用问题 - 游离状态。
git add
将工作区的文件添加到暂存区。添加到暂存区的文件才可commit到仓库(之前add
但修改了的文件仍在工作区,需要再add
进去)。
添加一个或多个文件到暂存区:git add <file1> <file2> ...
添加指定目录到暂存区(含子目录):git add <dir>
添加当前目录下的所有文件到暂存区:git add .
git commit
将暂存区内容添加到本地仓库中。
提交暂存区到本地仓库中:git commit -m [message]
。
提交暂存区的指定文件到仓库区:$ git commit <file1> <file2> ... -m [message]
参数:
-m [message]
:添加备注信息/注释,如果不加,Git 会打开编辑器让你直接编辑备注信息(在最后添加即可)。如果最后还没有备注信息,则 commit 会失败。-a
:设置修改文件后不需执行git add
命令,直接提交?--amend
:发起新提交,新的提交会替换上一次最新的提交,而不会产生新的提交记录(需要没 push 到远程?)。 对于未
add
的非缓存区文件(AM),commit
不会提交;对于已add
但修改了的缓存区文件(M),需重新add
才可commit
提交(因为不在缓存区中),或使用-am [message]
提交。
Linux中,commit备注使用单引号'
;Windows中,commit备注使用双引号"
。
所以在git bash中为:git commit -m '这是提交说明'
,在Windows中为:git commit -m "这是提交说明"
。
git diff
:比较暂存区和工作区的文件差异。会显示已写入暂存区和已经被修改但尚未写入暂存区的文件的区别。
后面可以指定文件<file>...
。
git diff --cached/--staged
:比较版本库和暂存区的文件差异。
同样,最后可以指定文件。
git diff [HEAD]/[branch]
:查看版本库某次的提交,与工作区的文件差异。
注意,HEAD、分支本质都是一样的,都是 commit id,只是 HEAD 指向当前分支。
可以加--stat
,以显示各个文件修改的摘要,而非整个diff信息。
显示两次提交或两个分支之间的差异:git diff <first-branch>...<second-branch>
git mv
可移动或重命名文件、目录或软连接。
语法:git mv [options] <file> <newfile>
(基本与mv
相同)
用法基本与mv
相同,但与mv
的区别在于:
如果某文件已缓存过,则:
对它git mv
移动/重命名时,会同时对缓存区中的该文件进行移动/重命名。
对它mv
时,不会同时更新缓存区中的该文件,所以缓存区会与工作区产生两个不同:删除了mv
前的文件,新增了mv
后的文件。需要重新add
。
git reset
可退回到某一次提交的版本。通过将 HEAD 指向指定的 HEAD 实现。
语法:git reset [--soft/--mixed/--hard] [HEAD]
最后的指针可省略,默认 HEAD。
最后可指定只回退某文件<file>
,默认全部。
HEAD说明:
HEAD
是一个指针,指向当前版本,HEAD^
指向上一个版本,HEAD^^
指向上上一个版本,HEAD^^^
指向上上上一个版本...
也可以用数字表示:HEAD~0
指向当前版本,HEAD~1
指向上一个版本,HEAD^2
指向上上一个版本,HEAD^3
指向上上上一个版本...reset的本质:移动 HEAD 指针及其指向的 branch(如果有,则为HEAD->branch->某版本)。
因此,reset --hard
除了可用来撤销提交,还可用于将 head 及其 branch 指向其它位置。checkout 只改变 head 位置?reset 会改变 head 的引用?
--mixed:
默认参数。
将版本库回退到指定版本,清空暂存区。
不影响工作区。因为 reset 导致工作区与版本库的差异,需要重新 add 到暂存区。
例:
$ git reset HEAD^ # 回退版本库内容到上一个版本
$ git reset 052e # 回退版本库内容到指定版本
$ git reset HEAD^ 1.c # 仅回退版本库中,文件1.c的版本到上一个版本
$ git reset HEAD # 清除所有已缓存内容(清空缓存区,但 HEAD 与当前相比没有改变任何文件,所以不会影响版本库)
$ git reset HEAD 1.c # 清除缓存区中1.c的缓存
应用:
1. 移除 add 错的文件(git reset HEAD
)。
2. 可像--soft
一样合并多次 commit 记录为一次(但与--soft
相比需多git add
一次)。
3. 当发现 commit 提交了错误文件时,如果修改错误再重新 commit,会留下一次错误的 commit 历史。此时可先reset
回到正确节点,在工作区修复错误后再 add、commit。
--soft:
git reset --soft [HEAD]
将版本库内容回退到某版本,工作区不变,并将此时工作区和版本库的有差异文件缓存到暂存区。
应用:
reset --soft
后直接 commit,可将回退版本与最新版本之间的任意多次 commit 合并为一次。可用于将多次简单、无明显意义的 commit 记录合并为一次。
--hard:
git reset --hard [HEAD]
将工作区和版本库的内容全部回退到某版本。
也即将整个文件夹的所有 Git 管理的文件恢复到和某版本一致(清空所有 Git 管理的文件再新建)。
但未曾 add 的文件 (untracked),不会被 Git 管理,不会被删除 。
==谨慎使用 hard!==会彻底删除工作区中所有被追踪的文件。如果文件曾 add 过,但从来没 commit 过,就永远没了;未 commit 的修改也会丢失。
应用:
放弃目前本地的所有改变,或是放弃 reset 目标节点后的所有 commit。
git revert [HEAD]:与 reset hard 类似,回退工作区和版本库,但不会删除回退了的记录,而是创建一个新的提交。
数据不会丢失,但就类似与将过去版本 merge 到当前版本,可能需要处理冲突。
git restore <file>...
:丢弃工作区的修改(如果工作区有未 add 的修改,丢弃,用缓存区中的内容替代)。
与加参数--worktree
的情况相同,表示将缓存区与工作区恢复到某个一致状态。
git restore --staged <file>...
:将之前 add 的缓存区文件丢弃。可用来处理之前没提交的 add 错或不再想 add 的文件,之后可以重新 add(不会影响版本库,只是将上次提交之后,新 add 的文件移除)。
git restore --source [HEAD] <file>...
:用版本库中,之前某次提交中的文件,替换掉当前工作区中的文件。
不会影响缓存区,之前添加到缓存区中的数据将保留。想要提交 restore 的数据,需要重新 add。
git restore --source --worktree [HEAD] <file>...
:用版本库中,之前某次提交中的文件,替换掉当前工作区和缓存区中的文件。
git rm
可删除文件。
语法:git rm <file>
(基本与rm
相同)
用法基本与rm
相同,但与rm
的区别在于:
如果某文件已缓存过,则:
git rm
不仅删除文件,还将删除记录更新到缓存区,以便更新版本库(会同时删除缓存区中的该文件(如果有))。
rm
只是删除文件,不会将更新提交到缓存区,也不会同时删除缓存区中的该文件,所以缓存区会与工作区产生一个不同:删除了该文件。需要重新add
。
git rm --cached <file>...
:删除缓存区中的某文件。可用来处理之前已提交的 add 错或不再想 add 的文件,之后可以重新 add(会影响版本库,会将之前提交的文件从版本库和缓存区删除,但保留在工作区)。
删除文件的恢复:
rm 删除(或修改错,想改回去)的文件,可用git checkout -- <file>
用版本库里的最新内容,替换工作区的版本。
git rm 删除的文件,可用git reset (HEAD .)
、git checkout (.)
恢复到版本库的最新内容(.
可改为具体的文件名?)。注意,删除的文件只能从版本库中恢复,之前未提交的修改都将丢失。
不过在git rm
已修改的文件时,会给出警告,只能使用 -f 删除。
git status
查看当前目录中文件状态(自上次提交之后文件的修改信息,所以自上次 commit 之后没有被修改的文件不会显示)。
使用-s
参数可获得简短的输出结果,有这几种:
A
表示这是一个新文件(上次 commit 没有)。M
表示自上次 commit 后文件有改动。D
表示文件之前被提交了,但现在被删除了。??
表示文件未被追踪 (untracked),即是一个新文件,且没有被 add 过。状态为红色,表示更新信息没有 add(changes not staged for commit);为绿色,表示更新信息已经 add,等待 commit(changes to be commited)。
使用 rm 删除文件不会 add 该文件,所以删除的文件将为红色 D;用 git rm 在删除时会 add,所以文件状态为绿色 D。
A 与 M 可以组合出现,通常(?) A 为绿色,M 为红色,表示这个新文件被 add 过,但之后又有未 add 的改动。
git push [name] [localBranch]:[remoteBranch]
:把本地的某分支,推送到远程仓库的某分支中。
如果远程仓库的该分支不存在,则创建。
如果两个分支不指定,则默认将当前分支推送到远程的同名分支?
如果只指定一个分支(git push [name] [branch]
),则默认将本地的 branch 分支推送到跟踪分支(上游分支)。
name 可以是仓库名,也可是 URL。
git push
后可以加-u
参数(是--up-stream
参数的缩写),表示将当前分支与这条 push 指定的仓库的分支绑定(建立本地分支与某远程分支的关联),指定的仓库的分支将成为当前分支的跟踪分支 (track branch) 或上游分支。
当git push/pull
后什么参数也不加时,git 会将上游分支作为默认仓库和分支进行推送或拉取。
每个分支都可存在一个追踪分支(后续的 -u 会覆盖前面的)。
通过
git branch --set-upstream-to=[repoName]/[branchName] [localBrach]
也可设置默认远程分支。
但如果指定的远程分支不存在,该指令不会创建相应分支,而git push -u
会。
所以git push -u origin main
表示将本地的 main 分支推送到 main 的上游分支上(要指定 origin 吗?),如果 origin 不存在该分支则新建,并建立上游分支关系;git branch --set-upstream-to=origin/main main
建立上游分支关系,但如果 origin 不存在对应分支,不会进行创建(所以如果先执行一条git push origin main
则两者等价)。上游分支会保存在
.git/config
中(如[branch "master"]
下的remote
和merge
属性)。通过命令行也可修改:git config branch.master.remote origin
、git config branch.master.merge refs/heads/master
。不带参数的
git push
默认只会推送当前分支到跟踪分支。这类方式叫 simple。
在 git 2.0 之前默认使用 matching 方式,默认会推送所有有对应远程分支的本地分支。
https://www.runoob.com/git/git-push.html
git pull [name] [remoteBranch]:[localBranch]
:从远程仓库的某分支中,拉取数据到本地的某仓库中。
https://www.runoob.com/git/git-pull.html
删除工作区中没有被跟踪/管理 (untracked) 的文件,也即未曾 add 过的文件。
注意,删除的文件将无法找回!慎用。
可以用来删一些临时文件,如 .o,.exe。
git clean
和git reset --hard
可以结合使用,让工作目录回退到某一次提交后的状态:
clean
清除未被管理的文件,reset
回退被管理的文件。
参数:
<path>
:可以指定只 clean 某个文件夹。git log
可查看历史提交记录。
暂时略过,具体见:https://www.runoob.com/git/git-commit-history.html#git-log
参数:
-<n>
: 是数字,只显示最近的 n 条提交记录。-p
或--patch
:详细显示每次提交与上次提交的差异(各个修改的文件、具体的修改内容)。--stat
:统计,简单显示每次提交中修改了的文件信息(修改了多少行)、总共增/删了多少行。--oneline
:显示简略信息,每个提交只显示一行,包括:哈希值的前7位,提交信息、标注的 tag、其它分支位置(如果有)。--graph
:以图标形式展现(好像就是好看了一点而已)。--before="..."
或--after="..."
:只显示某个日期之前/之后(不含)的提交。 2023-1-01
(0无影响,但年份要写全),3 days ago
。滚动内容:上下键/k/j 键:上下滚动;b/空格:上/下翻一页;q:退出。
git show
git show [HEAD]:查看某次的提交信息。
参数可以是 head 相关表达式,也可是一个 commit ID。
git blame
可以列表形式查看指定文件的历史修改记录。
语法:git blame <file>
tag (标签) 是类似 branch 的指针,指向一次提交记录,但不会随分支提交而改变。
通常用于发布新的 release 版本。
git tag <tagName>
:在当前分支位置,创建一个 tag。tag 会指向上次的提交记录。
git tag <tagName> -m <message>
:tag 可以附带一个注释信息。
没有注释的 tag 称为轻量级 tag。
git tag -d <tagName>...
:删除一个或多个 tag(--d 或 --delete 也可)。
git tag <tagName> <commitID>
:在之前的某次提交位置,创建一个 tag。
git tag
:列出版本库中的所有 tag。
git tag -l <pattern>
:列出符合指定模式的 tag。
git show <tagName>
:查看某个 tag 指向的提交的具体信息。
git push <name> <tagName>
:推送指定 tag 到指定远程仓库。
该推送会在远程仓库新建一个 release(发布点?)。
git push <name> --tags
:将本地版本库的所有 tag 推送到指定远程仓库。
git push <name> -d <tagName>...
:删除指定远程仓库中的某个或某些 tag。
一个分支是指向一个更改快照的指针。
执行git init
后,git 会创建一个 master 分支。
git branch <branchname>
:创建分支。
git branch -d <branchName>
:删除本地某分支。如果参数为 -D 则为强制,等价于 --delete --force。
git branch -d -r <branchName>
:删除远程某分支。更新需要 push 到服务器上:git push <name> <branchName>
。
git branch -m <oldName> <newName>
:重命名本地某分支。如果参数为 -M 则为强制,等价于 --move --force。
git branch
:显示本地的所有分支。前面加星号的是当前分支。
git branch -r
:显示远程的所有分支。
git branch -a
:显示本地和远程的所有分支(当前分支是绿色,远程分支是红色)。
git branch -vv
:显示默认的远程分支。
git checkout <branchname>
:切换分支。
git checkout -b <branchname>
:创建并切换到新的分支。
如果分支名存在则失败。
git checkout -d <branchname>
:删除分支。
切换分支后,Git 会用该分支的最后提交的快照替换工作目录的内容, 所以多个分支不需要多个目录。
注意,在切换分支后,已跟踪 (add 过) 的文件的所有未提交改动,都会丢失!
想要保留它们但不提交,使用git stash
。
git stash
:存储当前分支下的所有工作区改动。会存在.git/refs/stash
。
参数:
-m "msg"
:附加信息。-u
或--includ-untracked
:也储存未追踪的文件。-a
或--all
:也储存未追踪的文件和忽略的文件。-p
或--patch
:会显示工作区和HEAD的差异,通过编辑差异文件,排除不需要保存的内容?与 add -p 类似?--index
:恢复时不仅恢复工作区,还恢复暂存区。-k
或--no-keep-index
:指定不保存暂存区?git stash save "msg"
:与 -m 类似?附加信息并保存。
git stash list
:查看存储的信息列表。
git stash pop
:恢复最近保存的内容,并将其移出 stash。可以加stash@{n}
来指定 pop 哪个。
git stash apply stash@{n}
:恢复某次保存的内容,但不将其移出 stash。
git stash push <file>...
:保存指定文件的改动。
git stash show stash@{n}
:查看某次保存的内容,修改了哪些文件。
git stash show -p stash@{n}
:查看某次保存的内容,修改了哪些文件和具体的修改内容。
git stash clear
:删除所有保存的内容。
git stash drop stash@{n}
:删除指定的保存内容。
git stash branch <branchName> stash@{n}
:用某次保存的内容新建一个分支。如果当前分支和之前暂存的内容有冲突,可以先建一个临时分支。
如果不用 stash,可以先 commit 一次,切换分支;之后切换回来的时候 reset head^。
git merge <branchName>
:将某个分支与当前分支合并。
Fork:克隆服务端的代码仓库,会包含被克隆仓库的所有内容。
Fork完后的仓库就是你自己的、可自由提交的远程仓库。通过Pull Request可将你的提交贡献给原仓库,原仓库可以选择接受你的提交或不接受。
每个项目的配置文件.git/config
中都会记录自己的仓库 (repository) 名称与地址映射。
例:
[remote "origin"]
url = https://github.com/SovietPower/MIT-6.824-Labs.git
fetch = +refs/heads/*:refs/remotes/origin/*
fetch 的值有两部分,用冒号分割,分别为:本地仓库文件夹;远程仓库在本地的缓存文件夹。
git fetch 时,会将远程仓库的数据添加到缓存文件夹对应的分支中(所以前面是加号)。
git merge 时,会将缓存文件夹下的对应分支,合并到本地仓库(refs/heads/
)的对应分支中。
.git/refs/remotes
中保存了各个远程仓库在本地的缓存。
refs
文件夹中保存的不是实际数据,而是一个引用。实际的数据保存在objects
中。
每个 branch 信息的 remote 都记录了它对应的远程仓库。
git remote add [name] [url]
:添加远程仓库。
第一个参数 name 是主机名/仓库名(常见如 origin),可代替仓库地址 url。
在 git push 时可以用这个名字来指定要提交的仓库,也可以直接指定地址。
如:git remote add company https://git.company.com/123.git
定义一个名为 company 的仓库,地址是...。
git push -u company master
就会向该仓库推送分支,等价于git push https://git.company.com/123.git master
。
地址可以使用 HTTP 协议(如
https://github.com/SovietPower/learn_git.git
),也可使用 SSH 协议(如git@github.com:SovietPower/learn_git.git
)。
git remote rm [name]
:删除远程仓库。
git remote rename [oldName] [newName]
:修改仓库名。
git remote set-url [name] [newURL]
:修改仓库对应的地址。
也可以 rm 再 add,或直接修改.git/config
配置。
git remote show [name]
:查看某个远程仓库的具体信息。
git remote
:查看所有远程仓库名。
git remote -v
:显示所有远程仓库的具体信息。
v 是 verbose。
如:
$ git remote -v
origin https://github.com/SovietPower/MIT-6.824-Labs.git (fetch)
origin https://github.com/SovietPower/MIT-6.824-Labs.git (push)
git fetch
fetch 的数据不会直接合并到分支,所以要先 fetch 到本地的一个空分支,再 merge。
游离状态 / HEAD detached at refs/heads/... / HEAD is now at ... qq
git checkout
可以移动 head 指针,移动目标可以是分支,也可以是某一次的 commit 后的快照。
当指向 branch 时,分支提交后 HEAD 会和 branch 指针一起向后移动;当不指向 branch 时,则会在一个 detached 状态(游离/分离状态)。
$ cat .git/HEAD
ref: refs/heads/<branch name> // 指向分支
cad0be9ceb89f474c39360c4de337d4a8194cab0 // 游离状态
通过git checkout <commit id>
切换到过去的某一次提交,head 就进入游离状态。
(git checkout -d <branch>
删除一个未合并的分支?会删除失败,也会进入游离状态)
(或切换到一个远程的分支?不确定原因)
游离状态使我们能方便地切换到历史版本(只需要指定 commit id)。
但在游离状态的提交,会新建一个匿名分支提交(分支名为新的 commit id),所以该提交信息是无法保存的?如果此时切到别的分支,游离状态做出的提交就看不到了(不与任何当前分支绑定):you are leaving 1 commit behind, not connected to
。所以不推荐在该状态进行提交。
any of your branches
如果要保留游离状态的提交,可以新建一个临时分支保存下来:
// 如果已切换到其他分支(非游离状态),通过 commit id 创建
git branch <new-branch-name> <commitID>
// 如果还在游离状态,直接创建,然后切换过去。游离状态的更新会绑定到新分支?
git checkout -b <new-branch-name>
然后回到其它分支,merge 临时分支,提交后把临时分支删除即可。
如果临时分支来自远程分支,那可以用git push -u origin/branchName branchName
将其与远程分支关联。此时git pull
应该不会有影响(Already up-to-date.)。
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:git switch -c <new-branch-name>
或git checkout -b <new-branch-name>
。
Git没有中心服务器。之前提到的Git命令均在本地执行。要通过Git分享代码或者与合作开发,就需要将数据放到一台其他人能连接的服务器上。
比如使用Github作为远程仓库。
本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以需配置验证信息。
生成SSH key:
$ ssh-keygen -t rsa -C "youremail"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/your_user/.ssh/id_rsa):
Created directory '/c/Users/your_user/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/your_user/.ssh/id_rsa
Your public key has been saved in /c/Users/your_user/.ssh/id_rsa.pub
...
youremail
为Github账户邮箱。
然后可输入密码文件储存目录,按回车为默认路径(一般为C盘users)。
然后可设置密码,按回车为不设置密码。
然后到Github,选择 设置-Access,找到 SSH and GPG keys,选择 New SSH Key,任起一个名字,将密码文件目录下的id_rsa.pub
中的全部内容复制到key中,Add即可。
可用ssh -T git@github.com
测试是否连接成功:
如果出现You've successfully authenticated, but GitHub does not provide shell access.
即成功,如果出现The authenticity of host 'github.com' can't be established.
,看一下输出的fingerprint是否与Github的相同,如果相同输入yes再运行即可(不同就重新生成再试)。
首先在 Github 上建立仓库,复制其 SSH。
用git remote add origin <Your repo's SSH>
添加它到当前的远程仓库,命名为 origin(注意当前目录需要为git init
后的Git目录,添加的远程仓库会保存在.git/config
中)。
具体见 git remote。
使用GitHub Desktop管理GitLab仓库:https://zhuanlan.zhihu.com/p/403193674
使用HTTP连接,输入账号密码。
使用和github一样的方法。
如果邮箱已经创建了key,则直接用.pub
里的key即可。