一,搭建Git环境并连接上Github
1,在linux安装git
yum install git 或者 sudo apt install git 看centos 还是ubuntu
安装成功后,使用
git --version
查看是否安装成功和版本号
2,进行Git配置,参考https://blog.csdn.net/weixin_40423553/article/details/78867807的第二步
git config –global user.name “your name” //配置用户名,比如abc
git config –global user.email “your email” //配置email,比如abc@qq.com
3,使用命令 ssh-keygen -t rsa -C “abc@qq.com” 生成ssh key,用于连接github的
过程中会提示按enter和yes
可能出现的问题和解决
https://blog.csdn.net/weixin_40816738/article/details/90247205
会在用户主目录或root目录下生成隐藏文件.ssh/id_rsa.pub
4,登录github,在settings 里面点击SSH and GPG Keys,添加一个ssh key,title
title是项目名,ssh key是上一步的.ssh/id_rsa.pub文件里面的内容复制出来粘贴上去。
在linux上使用ssh -T git@github.com命令验证是否连接成功
提示You’ve successfully authenticated, but GitHub does not provide shell access就是成功了
如果只是想下载github上的项目到本地,只需第1,2步,如果需要提交到github则需要1234。以上配置完成,下面是命令理解可以不看。
命令理解
https://blog.csdn.net/sjt19910311/article/details/83685616
git config --global 因为Git是分布式系统,配置了自己的名字和邮箱,这样就是有了“身份”
https://blog.csdn.net/weixin_42752574/article/details/106367959
ssh-keygen -t rsa -C “abc123@qq.com”
使用该命令获取公钥,t表示类型 RSA或DSA, C表示注释,给密钥一个注释
执行完会获得注释的公钥文件,将公钥复制到github里面。
ssh -T 是不显示终端的连接,T就是不需要终端
二,下载一个Github项目到本地
cd命令到任意想要放目录的地方
git clone https://github.com/xxxxx.git
链接在github找到想要down的项目即可
或者
git clone git@github.com:abcdefg/gitproject.git
三,创建一个新项目并上传到Github
1,在github上创建一个新的仓库,点击右上角的的+号,new repository,
填上 repository name 和 description ,点击 create repository,这样就创建出一个新的仓库/一个新的项目,会有仓库地址链接https://github.com/用户名/仓库名.git
2,在Linux中,cd命令到想要放新项目的目录,假设为/home/Gitproject/,使用git init 初始化仓库,即此目录可以被git管理。
会产生隐藏文件.git。
3,新建文件并提交
touch main.cpp 新建一个文件在/home/Gitproject/里面
3.1使用 git add main.cpp 将文件添加到仓库
3.2使用 git commit -c “one change note” 将文件提交到仓库
3.1可以同时add多个文件
3.2是将3.1所add的所有文件都提交到仓库
理解,
git add将文件存入暂缓区
git commit将暂缓区的文件全都提交到仓库,commit可以理解成一个版本,一次修改
git add . 将当前目录下的所有文件都提交,防止漏add
4,关联仓库与远程github仓库
使用git remote add origin http://github.com/用户名/仓库名.git
把当前仓库取名为 origin 和github仓库进行关联。
5,将本地库上传到github仓库
使用git push -u origin master
第一次加上 -u 之后就不需要,直接 git push origin master
将本地库提交到github上,就可以看到新提交的文件了
理解,
使用git status 和 git diff可以查看当前的状态和修改过的变化,
git status查看哪些文件被改过
git diff 文件名 查看文件哪里被该过
git remote rm <name>
命令可以删除远程库,使用前,建议先用git remote -v
查看远程库信息
四,版本更换
1,使用git reset --hard commit_id
可以将版本回退到指定commitI的各个版本
2, 使用git reset --hard head 回退到当前版本,即清空暂存区,同时还将工作区的改成与当前版本一致
3. 使用git reset --hard head^ 回退到上一个版本
4.使用git reset --hard head~100 回退到前100个版本
git log 查看commit的记录。或者用git log --pretty=oneline
git reflog 用来记录你的每一次命令
不同场景的用法
1,当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
2,当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。
3,已经提交了不合适的修改到版本库时,想要撤销本次提交,参考上面的git reset --hard head^等命令,不过前提是没有推送到远程库。
在1中git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
如果在工作区删除了文件file,但这个file曾经提交到版本库,可以通道git checkout --file恢复它,如果git status发现版本库与工作区不一样,且真的想要删掉它,就用git rm file
关于--hard --soft --mixed 下面会有更详细的理解
五,Git结构
https://www.liaoxuefeng.com/wiki/896043488029600/897271968352576
首先需要理解一些概念
1,我们在/home/Gitproject/目录创建了一个仓库,这个目录我们称之为工作区
2,在/home/Gitproject/.git里面,有一个暂存区,里面包含了我们add过程中的所有文件
3,在整个/home/Gitproject/.git,我们称之为版本库,里面包含了我们commit过程中的各个版本
所以仓库的流程就是 add一个文件到暂存区,commit暂存区的所有文件到仓库中,作为一个版本。
commit之后,暂存区就空了,可以理解成一个集装箱,add往集装箱装货,commit将集装箱打包送货出去。
六,创建分支与切换
1,使用git checkout -b 分支名命令可以创建分支并切换到该分支
相当于两条命令
1.1git branch 分支名 创建分支
1.2git checkout 分支名 切换分支
2,查看当前分支情况
git branch
新版已经支持用swithc来创建和切换分支了,因为checkout的用法很怪
git switch -c <name> 进行创建和切换
git swithc 分支名 进行切换
3,合并分支
git merge dev
假如当前是master分支,使用上面的命令将会合并指定分支到当前分支。例如在dev分支中建立文件file2,在master看不到,使用git merge dev后,将会看到这个文件
合并之后就可以删除这个分支了
git branch -d dev
用git log --graph
命令可以看到分支合并图
当存在冲突时,需要手动进行修改commit再合并,在git status 可以看到冲突信息
使用git merge dev可以合并分支,但是合并之后,会丢失分支信息,这样就不好看到曾经做过的分支内容
使用带--no-ff命令将会保留分支信息,同时创建新的commit进行连接
git merge --no--ff -m "meger dev" dev
因为会有新的commit,所以要给个标注
七,bug解决与分支问题
1,使用git stash可以隐藏当前分支
2,使用git stash list查看隐藏了的分支,
恢复方式一是用git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;
另一种方式是用git stash pop
,恢复的同时把stash内容也删了:
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
8,feature分支
feature分支用于已经开发好的分支,然后需要将其删掉
1,创建并切换到feature分支,准备进行项目的更新开发。
git checkout -b feature
2,回到master分支准备合并
git checkout master
但是领导说这个功能不要了
3,强制删除未合并的分支
git branch -D feature
9,多人协作
多人协作的工作模式通常是这样:
-
首先,可以试图用
git push origin <branch-name>
推送自己的修改; -
如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; -
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
小结
-
查看远程库信息,使用
git remote -v
; -
本地新建的分支如果不推送到远程,对其他人就是不可见的;
-
从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交; -
在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致; -
建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
; -
从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突。
-
rebase操作可以把本地未push的分叉提交历史整理成直线;
-
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
git rebase f1 f2
将f2的分支内容添加到f1之后,当前指针指向f2
10,标签管理
使用tag来指向一个commit用来表示版本
1,切换到需要打标签的分支
git checkout 分支名
2,打标签
git tag v1.0
v1.0就是标签
3,查看所有标签
git tag
4,查看指定标签
git tag -a <tagname> -m "blablabla..."
可以指定标签信息
5,对指定commit打标签
git tag v0.9 fkldjf
6,删除标签
git tag -d v0.1
-
命令
git push origin <tagname>
可以推送一个本地标签; -
命令
git push origin --tags
可以推送全部未推送过的本地标签; -
命令
git tag -d <tagname>
可以删除一个本地标签; -
命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签。
10,远程分支
使用git fetch命令更新远程分支的状态,远程分支为o/main,我们不能对其进行修改
在使用git checkout o/main时会分离出HEAD,从而对HEAD进行操作。
git fetch 并不会下载文件到本地影响
那么如果想要合并自己的分支与远程分支,
很容易可以用 git fetch git merge
在git中添加了git pull命令来完成这一操作
git pull将更新远程分支,同时合并到当前分支来
而push将自己的变更上传到远程库,在远程库合并新的提交。
如果远程库修改过,我本地未fetch最新版的远程库,就开发了新的功能
那么就需要用 git fetch git rebase git push实现提交
可以用 git push --rebase git push实现
11,回退reset
11,命令简记
git的区有:工作区,暂存区,版本库,远程库
git add xxx 将xxx文件或目录从工作区添加到暂存区
git commit -m “xxx” 将暂存区的所有文件提交到版本库成为一个“新版本”,-m “xxx” 为其打标注
git push 将版本库内容推送到远程库
git branch abc 在当前位置新建分支abc,也可以用git checkout -b abc
git fetch 将远程库内容同步到本地,不是同步文件,因为没有带参数,所以是所有分支
git merge abc 将abc分支合并到当前分支上来
git pull 将远程库内容同步到本地,同时合并到当前分支,相当于 git fetch + git merge
git cherry-pick abc 将版本abc的内容添加到当前分支
git rebase -i abc 将当前分支整体移动到abc分支上去,还是指向当前分支,但是接在abc分支后面
git rebase abc def def为当前分支,添加到abc分支后面,还是指向def分支,但是接在abc分支后面
git reset HEAD 回退到当前版本,即把暂存区清空,工作区不变,(用git status会提示工作区有些文件没有add到暂存区)
git reset --hard HEAD 回退到当前版本,把暂存区和工作区清空,保持和版本库的当前版本一样(用git status会提示干净,因为在工作区新写的文件都没了)
git reset HEAD^ 默认参数是mixup,回退到上一个版本,即把暂存区清空,工作区不变(用git status会提示工作区有些文件没有add到暂存区)
git reset --hard HEAD^ 回退到上一个版本,把暂存区和工作区清空,保持和版本库的当前版本一样(用git status会提示干净,因为在工作区新写的文件都没了)
git reset --soft HEAD^ 回退到上一个版本,工作区不变,暂存区不变,相当于我不想commit了,再写写代码再commit(用git status会提示干净,因为是恢复到将要commit前的状态)