文章目录
集中式 VS 分布式
集中式版本控制系统,
版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。
中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
集中式版本控制系统最大的毛病就是必须联网才能工作
如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟。
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,无需联网。
多个人协作,只需把各自的修改推送给对方,就可以互相看到对方的修改了。
分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
CVS作为最早的开源而且免费的集中式版本控制系统,直到现在还有不少人在用。由于CVS自身设计的问题,会造成提交文件不完整,版本库莫名其妙损坏的情况。同样是开源而且免费的SVN修正了CVS的一些稳定性问题,是目前用得最多的集中式版本库控制系统。
使用GitHub远程仓库
step1 创建ssh key
ssh-keygen -t rsa -C “youremail@example.com”
step2 登陆GitHub,打开“Account settings”,“SSH Keys”
step3 git bash ssh 连接到GitHub,添加远程仓库
登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库。
git bash 终端,输入如下命令检测是否能够ssh连接github,
ssh -T git@github.com
step4 把本地仓库和远程仓库进行关联
git remote add origin git@github.com:echoyzt/allbijis.git
origin 是远程仓库在本地的别名
git@github.com:echoyzt/allbijis.git 远程仓库的路径
如何同一台电脑管理多个sshkey
余智天: 如果我想访问两台git服务器,我笔记本ssh私钥怎么处理呢?有两份私钥了
- 生成不同的密钥对: 使用ssh-keygen命令为每个服务器生成独立的SSH密钥对。例如,分别为服务器A和服务器B生成密钥对:ssh-keygen -t rsa -C “your-email@example.com” -f ~/.ssh/id_rsa_server_a
ssh-keygen -t rsa -C “your-email@example.com” -f ~/.ssh/id_rsa_server_b
bash这样将会分别生成私钥id_rsa_server_a和id_rsa_server_b以及对应的公钥id_rsa_server_a.pub和id_rsa_server_b.pub。2. 配置SSH配置文件: 编辑或创建~/.ssh/config文件,以便为每个服务器指定不同的私钥:# 配置服务器A
Host server-a-hostname-or-ip
HostName server-a-host.example.com
User your-username-on-server-a
IdentityFile ~/.ssh/id_rsa_server_a
配置服务器B
Host server-b-hostname-or-ip
HostName server-b-host.example.com
User your-username-on-server-b
IdentityFile ~/.ssh/id_rsa_server_b
ini在这里,server-a-hostname-or-ip和server-b-hostname-or-ip是你为两个服务器定义的别名,用于在命令行中快速引用它们。而HostName字段填写实际的服务器域名或IP地址,User字段填写你在对应服务器上的用户名,IdentityFile则指向相应的私钥文件。3. 将公钥上传到Git服务器: 分别将两个公钥上传到各自的Git服务器。例如,将id_rsa_server_a.pub的内容复制并粘贴到服务器A的SSH公钥设置中,同样操作将id_rsa_server_b.pub的内容上传至服务器B。完成以上步骤后,当你通过SSH连接Git服务器时,只需使用配置好的别名,SSH就会自动使用正确的私钥进行身份验证:git clone ssh://server-a-hostname-or-ip/repo.git
git clone ssh://server-b-hostname-or-ip/another-repo.git
bash这样,你的笔记本就可以根据目标服务器智能地切换私钥来进行认证了。
合并冲突
远程仓库操作
查看远程仓库
yuzt@SHJQZD210218L MINGW64 /d/gitRepo/testgitlabstream (develop2)
$ git remote
origin
origin ——这是 Git 给你克隆的仓库服务器的默认名字
yuzt@SHJQZD210218L MINGW64 /d/gitRepo/testgitlabstream (develop2)
$ git remote -v
origin http://yuzttest:yuzt021zsh@101.132.249.52:8001/gitlab-instance-99486f77/testgitlabstream.git (fetch)
origin http://yuzttest:yuzt021zsh@101.132.249.52:8001/gitlab-instance-99486f77/testgitlabstream.git (push)
工作区 vs 暂存区 vs 版本库
- workspace:工作区,就是你在电脑里能看到的目录
- staging area:暂存区/缓存区,英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- local repository:版本库或本地仓库,工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
- remote repository:远程仓库
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:
——————————————————————
git diff 显示未暂存的变更 --cached 显示已经暂存的变更
git log,
git reflog
git log --pretty=oneline
git log --graph --pretty =format:“%h %s”
撤销文件修改
git checkout –
当数据使用add 添加到暂存区后
思路:先从暂存区里面移除相应的文件
删除文件
将文件从暂存区和工作区中删除
git rm
如果删除之前修改过并且已经放到暂存区域的话,必须用强制删除选项 -f。
强行从暂存区和工作区中删除修改后的 runoob.txt 文件
git rm -f runoob.txt
如果想把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用 --cached 选项即可
git rm --cached
再提交
git commit -m 备注
git show ID号
git show-branch -r显示远程分支,-a显示所有分支
git文件状态
untracked
tracked (执行git add 之后)
ignored(.gitignore文件)
——————————————————————
给远程仓库起别名
git remote add origin 远程仓库地址
git push -u origin 分支
git clone 远程仓库地址(第一次下载版本)
非ssh方式:
git clone http://root:yuzt021zsh@101.132.249.52:8001/root/liveroom-test.git
git pull origin 分支
——————————————————————
rebase 变基 使多条git提交记录合并成一条记录
git rebase -i HEAD~3 (合并最近的3条记录)
注意:不要合并已经push到版本库的记录
git rm --cached 会删除索引中的文件并把他保留在工作目录。
git rm 将文件从索引和工作目录中都删除。
git mv a.cpp b.cpp
git cat-file -p SHA1
git rev-parse 3b18e512d
git tag -m"xxx" V1.0 3ede462
git ls-files --stage
git bisect
git show-branch
检出分支 git checkout 已存在的分支名
git diff ???
@@ -1,4 +1,5 @@
- 表示第一个文件,1表示第一行,4表示连续4行
"+1,5"表示第二个文件从第一行开始的连续5行。
——————————————————————
关联仓库,同步分支
在分支A, 本地创建分支B,并关联远程分支B,不切换分支。
git branch develop origin/develop
在分支A,如果远程有分支B,本地没有该分支。
git checkout --track origin/branch_name
这时本地会新建一个分支名叫 branch_name,
会自动跟踪远程的同名分支 branch_name,且自动切到branch_name 分支。
如果本地新建了一个分支 branch_name,但是远程没有。
这时候 push 和 pull 指令就无法确定该跟踪谁,
一般来说我们都会使其跟踪远程同名分支,
git push --set-upstream origin branch_name
这样就可以自动在远程创建一个 branch_name 分支,
然后本地分支会 track 该分支。后面再对该分支使用 push 和 pull 就自动同步。
远程已有remote_branch分支并且已经关联本地分支local_branch且本地已经切换到local_branch
git push
远程已有remote_branch分支但未关联本地分支local_branch且本地已经切换到local_branch
git push -u origin/remote_branch
远程没有remote_branch分支并且本地已经切换到local_branch
git push origin local_branch:remote_branch
———————————————————————
gitstatus git ls-files -u 查看未合并的文件
裸版本裤可以简单的看成.git目录的内容
git stash save
git flow init
4 分支管理-Bug分支
git stash :把当前的工作隐藏起来 等以后恢复现场后继续工作
git stash list :查看所有被隐藏的文件列表
git stash apply :恢复被隐藏的文件,但是内容不删除
git stash drop: 删除文件
git stash pop: 恢复文件的同时 也删除文件
Git基本常用命令如下:
git diff XX : 查看XX文件修改了那些内容
git reflog : 查看历史记录的版本号id
git checkout – XX : 把XX文件在工作区的修改全部撤销。
git rm XX : 删除XX文件
本地仓库到远程仓库的操作
git remote add testgit https://github.com/RTplay/testgit.git: 添加一个远程库
git push -u(第一次要用-u 以后不需要) origin master :把当前master分支推送到远程仓库master分支。