文章目录
- 操作命令
- 基本组成框架
- github的使用
-
- 将本地仓库关联到远程仓库
- 将远程仓库关联到本地和拉取指定分支、切换远程分支
- 提交本地仓库到远程仓库
- 保存当前工作切换分支
- 将别的分支修改转移到自己的分支
-
- [远程删除分支后本地git branch -a依然看得到的问题](#远程删除分支后本地git branch -a依然看得到的问题)
- 强制合并分支
- 拉取远程所有分支
- 子模块管理
- 分支开发步骤
- 强制删除分支
- 查看不同分支的文件差异
- 查看仓库信息
- 新增分支操作
- 命令总结
操作命令
Centos yum -y install git #安装git 根据系统来安装
ubuntu apt install -y git
git --version #看git版本号
bash
配置git环境
git config --global user.name "名称" #名称中间有空格需要加双引号,没有则无需加
git config --global user.email 123@qq.com #中间没有空格所以没有加
git config --global credential.helper store #用户名和密码
git config --global --list #查看刚配置的信息
bash
创建仓库
git init #创建空仓库,没有会自动创建git仓库 默认是隐藏目录,用ls -a查看
git init 名称 #给创建的git仓库起个名称
git status #查看状态
bash
把文件添加到缓存区,并提交到本地仓库
git add 文件 #添加到缓存区,等待被提交
git commit -m "说明" #提交到本地仓库仓库、不加m会进入vim里面
git commit --amend #如果发现刚才的注释写错了,用这个来修改并保存即可
bash
git log #查看提交记录
下面是提交记录的内容
commit b9e3a0d708ee5a81ea5ff383c6dabe716eec8cf1 (HEAD -> master)
Author: StephenZhou <stephenzhou@StephenZhou.www.malloc.pro>
Date: Tue Dec 29 12:15:13 2020 +0800
test add new file "test.c"
#后面的head是指向的意思,表示这次提交到哪儿,head->master代表这次提交到master主仓库,如果是head->分支仓库则代表提交到分支仓库
commit b9e3a0d708ee5a81ea5ff383c6dabe716eec8cf1 (HEAD -> master)
#Author是提交者是谁的意思,显示格式是:用户名 <邮箱>
Author: StephenZhou <stephenzhou@StephenZhou.www.malloc.pro>
#Date的意思是提交时间,后面的+0800这个是格林尼治时间,代表当前是以哪儿的时间地作为基准,这是世界时间,用它来作为基数与当前所在地时差进行计算,包括地球自转等公式。
Date: Tue Dec 29 12:15:13 2020 +0800
#最下面的就是注释了
test add new file "test.c"
#如果提交记录过多,用--pretty=oneline来简洁输出
git log --pretty=oneline
回滚代码仓库 git reset --hard
reset参数是重置命令
--hard是重置代码仓库版本
有三种模式
--soft 、--mixed以及--hard是三个恢复等级。
- 使用--soft就仅仅将头指针恢复,已经add的暂存区以及工作空间的所有东西都不变。
- 如果使用--mixed,就将头恢复掉,已经add的暂存区也会丢失掉,工作空间的代码什么的是不变的。
- 如果使用--hard,那么一切就全都恢复了,头变,aad的暂存区消失,代码什么的也恢复到以前状态。
bash
git reset --hard id
#回滚当前仓库指向的版本
git reset --hard HEAD^ #^代表上一个版本的意思,HEAD代表当前仓库的指向,当前HEAD指向master,就代表回滚到master上一次提交的版本
git reset --hard HEAD~3 #后面的~3,代表以当前版本为基数,回滚多少次。HEAD~3代表回滚master前三个版本
bash
git rm #删除文件
#此方法仅限git rm,因为git rm会先将文件放入缓存区,且没有使用commit提交的情况下
git rm后恢复文件:git rm、git reset、git checkout
#首先使用git rm删除一个文件
git rm d.c
#在使用git reset重置所有缓存区操作
git reset
#重置完成之后在使用git checkout命令将文件取消操作
git checkout d.c
git reflog #查看提交历史,git reflog可以查看当前版本库的提交历史,凡是对仓库版本进行迭代的都会出现在这个里面,包括你回滚版本都会出现在这个历史中
bash
创建分支:git branch、git checkout
#使用git checkout -b参数来创建一个分支,创建完成分支后会自动切换过去
git checkout -b dev
#然后我们在使用branch来查看当前属于哪个分支,也就是查看HEAD的指向
git branch #前面带*的就是目前在哪个分支下
切换分支:git checkout
#当我们想切换分支可以使用git checkout来切换,如刚刚我们创建了一个分支dev并切换了过去,现在切换回masterk
git checkout master
git branch
合并分支:git merge
#当我们新建分支并做完工作之后,想要把分支提交至master,只需要切换到master仓库,并执行git merge 分支名就可以了
#如我们在分支中新建了一个f.c和test.c的文件
#然后在使用git checkout master切换到master
#在使用git merge dev将其合并
就是说,你现在的分支下提交到本地仓库里的文件才能合并,没有提交到本地仓库无法合并。
git branch -D 分支名 #删除本地分支
git push origin --delete 文件名 #删除远程分支
基本组成框架
Workspace、Index / Stage、Repository、Remote
- Workspace:开发者工作区
- Index / Stage:暂存区/缓存区
- Repository:仓库区(或本地仓库)
- Remote:远程仓库
Workspace:开发者工作区,也就是你当前写代码的目录,它一般保持的是最新仓库代码。
Index / Stage:缓存区,最早叫Stage,现在新版本已经改成index,位于.git目录中,它用来存放临时动作,比如我们做了git add或者git rm,都是把文件提交到缓存区,这是可以撤销的,然后在通过git commit将缓存区的内容提交到本地仓库
Repository:仓库区,是仓库代码,你所有的提交都在这里,git会保存好每一个历史版本,存放在仓库区,它可以是服务端的也可以是本地的,因为在分布式中,任何人都可以是主仓库。
Remote:远程仓库,只能是别的电脑上的仓库,即服务器仓库。
在开发中git分支的重要性
当我们在开发中,无论做什么操作都建议使用分支,因为在团队开发中,master只有一个,合作开发里任何人都可以从master里拉取代码,拉取时master后创建分支,分支名改为你要做的操作,比如修改某某文件,修改什么什么bug,单词以下划线做分割,然后在提交一个版本
分支名必须简洁,和标题一样,提交的commit在简单描述一下就可以了。
如我们的master中有个bug,是内存泄漏
我们可以常见一个分支名为Memory_Leak,然后在commit里简单描述一下修复了哪个模块的内存泄漏,不要写修复了什么什么代码,什么什么问题导致的,只需要简单描述一下就可以了。
一般情况下,我们都是拉取master后,想要修改功能或者添加功能,都是创建分支,在分支里修改不影响master,如果修改错了代码或者误删之类的,在从master上拉取一份就可以了。
github的使用
1.首先到github上注册一个你的账号
2.在本地创建一个ssh的key,因为github是使用ssh服务进行通讯的
bashssh-keygen -t rsa -C "your_email@example.com"
- -t 指定密钥类型,默认是 rsa ,可以省略。
- -C 设置注释文字,比如邮箱。
- -f 指定密钥文件存储文件名,一般我们默认,让存储到默认路径以及默认文件名
它会要求输入Enter file in which to save the key (/home/stephenzhou/.ssh/id_rsa)
这里是生成的sshkey文件名,我们可以回车使用默认文件名
除此之外还会让你输入
Created directory '/home/stephenzhou/.ssh'.
Enter passphrase (empty for no passphrase):
这个密码会在让你push提交时候要输入的,除了git登录密码,还要输入这个密码,直接回车则空密码,这里我们直接回车
接着会让你在此输入密码,验证这里依旧回车
Enter same passphrase again:
bash
ls /root/.ssh/
authorized_keys id_rsa id_rsa.pub
#id_rsa是私匙,id_rsa.pub是公匙,id_rsa不能告诉任何人,只有公钥可以,ssh采用的是非对称加密。
接着在github上添加你的公钥
右上角头像---settings---左边SSH
你可以添加如很多个ssh,比如你有多台电脑,在每个电脑上都配置ssh然后添加进来就可以了,git需要这个是要确定你是主人,确定是主人的机器推送的才可以推送到仓库中,但是你可以创建公开仓库,别人只能拉取不能推送到这个仓库中,你可以给其它人权限。
找到你要开放的仓库,选择Manage access然后使用invite a cikkaborator添加成员就可以了。
将本地仓库关联到远程仓库
git remote add origin
#我们本地有一个仓库,我们想把它推送到远程上去,很简单,我们只需要使用git remote add origin命令就可以了,ongin是github上的仓库名称,意思是远程仓库的意思。
首先选择仓库的code找到github生成的远程仓库链接
然后关联
bash
git remote add origin git@github.com:beiszhihao/test.git
然后使用git push推送到远程
bash
git push -u origin master
push #将本地仓库与远程仓库合并
-u #将本地仓库分支与远程仓库分支一起合并,就是说将master的分支也提交上去,这样你就可以在远程仓库上看到你在本地仓库的master中创建了多少分支,不加这个参数只将当前的master与远程的合并,没有分支的历史记录,也不能切换分支
origin #远程仓库的意思,如果这个仓库是远程的那么必须使用这个选项
master #提交本地matser分支仓库
注意第一次提交ssh会让你验证是否来自github
输入yes就可以了
我们不需要登录,因为github上的ssh列表里有这台机器
注意第一次的时候加上-u就可以了,因为我们本地其它可能有很多分支也提交上去,以后只提交最新代码就可以了git push origin master,不需要在提交其它分支
将远程仓库关联到本地和拉取指定分支、切换远程分支
git clone -b分支名 仓库地址来指定分支
当我们远程有仓库时,想要关联到本地只需要使用git clone就可以了
新建一个空目录,不要git init
使用git clone会自动帮我们初始化
鉴于刚刚的,我们上传的代码在远程仓库中有一个默认的main和master,由于我们最初上传的分支是master,所以github给我们创建了一个新的分支叫master,并没有关联到mian中,我们拉取时,默认拉取的是main分支
提交本地仓库到远程仓库
git add、git commit、git push
我们修改了master 上的分支代码,然后使用git add 提交到缓存区,在使用commit 提交到本地仓库,在使用push推送到远程就可以了,非常简单,命令都是我们学过的
修改分支名称
git branch -m 分支名 新的分支名
保存当前工作切换分支
git stash
在你当前工作区修改了文件或者其它功能时,你想要切换或者创建到其它分区是不可能的
我们分支修改了内容,想要切换到其它分区git会终止你这样操作,为的是防止丢失当前工作区内容。
我们可以使用git stash命令来保存当前工作状态
bash
git stash
保存工作状态之后可以使用git stash list查看当前存储了多少工作状态
bash
git stash list
那么此时我们就可以切换到其它分支了
当在别的分支做完事情之后,在切换回刚刚的分支,然后在刚刚的分支中将状态恢复
bash
git stash pop
一般情况下,我们在修改代码时,突然来了一个新的需求,让我们先去做这个需求,但是此时我们正在写的代码还没有完成,是不可以提交的,所以我们先使用git stash保存当前工作状态,在拉取一个分支去这个分支里面干活,干完活之后回到之前的分支,在将工作内容恢复出来继续干活
git stash pop会将list保存的列表也给删除掉
git stash apply 不会删除列表里的内容会默认恢复第一个
如果想恢复指定内容可以使用git stash apply list名称
git stash drop list名称可以移除指定list
git stash clear 移除所有lsit
git stash show 查看栈中最新保存的stash和当前目录的差异。
注意stash是以栈的方式保存的,先进后出。
准确来说,这个命令的作用就是为了解决git不提交代码不能切换分支的问题。
将别的分支修改转移到自己的分支
git cherry-pick 分支名
有的时候我们从别的仓库拉取分支下来,是有bug的分支,但是master修复了,我们分支仓库没有修复,但是我们难不成重复master操作去修改这个bug?不不太繁琐了,我们直接使用cherry-pick命令将改动copy到我们分支上就可以了,这个命令只会将master改动代码合并到我们分支上,不会修改我们的代码。
git会检查master做了哪些修改,然后同步到我们的分支上,此时我们的分支依然是我们自己的代码,且会生成一个版本仓库。
做这个操作之前建议提交一次,便于恢复。
使用git cherry-pick 分支名即可合并分支修改,在此之前要保证你仓库代码是提交的,才可以进行这个步骤。
其次你可以使用git log查看commit 然后使用git cherry-pick也是可以的,合并分支的指定历史版本
远程删除分支后本地git branch -a依然看得到的问题
git remote
这个问题是因为本地没有更新分支缓存
可以使用remote命令对远程仓库进行操作
使用 git remote show origin命令查看远程仓库信息
bash
git remote show origin
如果在里面没有看到删除后的分支就代表这个分支在远程已经被删除了。
使用prune参数刷新本地分支仓库
bash
git remote prune origin
强制合并分支
--allow-unrelated-histories
当我们在使用两个不同的分支时或此分支不是从原生仓库中分支出来的,想要合并不符合GIT规则,所以会弹出:fatal: refusing to merge unrelated histories 的错误,比如当我们在本地开发好了,但是并没有在一开始关联远程仓库,若想提交就会出现这样的错误,我们先拉取下来以后合并分支在后面加上这条语句就可以了
bash
git merge master --allow-unrelated-histories
拉取远程所有分支
git fetch
当我们在本地进行开发时,有时会发现有些分支看不见
可以使用git fetch把远程全部分支拉取下来,同时也包括这些分支的仓库版本,log日志等,这个操作不会进行合并。
bash
git fetch
拉取后结果如下:
也可以拉取指定分支的最新内容:
bash
git fetch xxxx
子模块管理
git submodule
在当我们项目较大的情况下,都会使用模块化编程,把不同的业务功能分割成数个子模块,git也拥有对子模块进行管理的方法,submodule,可以使用它来添加子模块与管理子模块。
如添加一个子模块:
bash
git submodule add http://192.168.1.88:7990/scm/wlibold/weye_lib.git
使用如上命令会添加一个子模块,名为weye_lib的子模块到自己的仓库中,这样我们就可以使用了
在添加时会添加仓库的最新版本,但是此模块不会自动更新,需要我们手动更新,当子模块的仓库进行了更新,我们需要进到此子模块的文件夹中执行如下命令:
bash
git submodule update
这样就会自动化更新了模块到最新版本。
若我们想要使用指定版本的子模块也可以使用切换版本命令来完成子模块的版本切换,同时你也可以使用git log命令查看这个子模块的版本提交。
注意根据git版本不同的原因,你在添加时可能下来的子模块是空项目,这个时候可以使用如下命令:
首先进入到克隆下来的子模块目录,并执行如下命令:
bash
git submodule init
git submodule update
最新的git在使用add添加子模块时会自动使用这两个命令。
这两个命令作用分别是初始化子模块仓库,更新远程子模块仓库到本地,最早的git添加子模块只是先在本地生成了映射关系,需要手动执行这两个命令。
最后别忘记使用git add与git commit提交一次。
在提醒一下,若你使用的子模块版本是0.17,最新版本是2.13,当别人拉取你仓库时子模块也会是0.17不会变动。
分支开发步骤
一般情况下我们开发都要在不扰乱master代码的情况下进行开发
1.拉取分支,分支名简明摘要说要干什么,然后干活,在合并到master,合并之后在删除分支,这是基本步骤,不需要留额外分支,分支只是为了将来看代码时方便而已,能看到这个分支是干什么的。
强制删除分支
git branch -D
如果遇到无法删除的分支可以使用git branch -D 大写的D即可。
查看不同分支的文件差异
git diff
查看仓库信息
git remote
使用git remote可以查看当前仓库名称
bash
git remote
使用remote -v可以查看更详细的权限信息
fetch代表可以拉取仓库,push代表可以推送。
如果没有权限只能拉取的情况下不会显示push。
git查看日志简洁方法:git log
bash
git log --graph --pretty=oneline --abbrev-commit
注意前面的字符串是有效的,你可以用它来切换版本或者合并分支。
新增分支操作
git switch、git restore
这两个命令是git 2.23以后引入的命令,目的是为了提供对新手更友好的分支操作,最早我们使用的是git checkout命令来对分支进行操作,这个命令相对于复杂了许多,使用很多子参数来进行操作,为此git新增了两个命令:switch、restore,switch是用来切换分支与新增分支的,而restore用来撤销文件的修改,使其变得更明确一点
切换分支:
bash
git switch dev
注意如果分支不存在,是不会创建的
切换到commit ID:
切换到指定id并创建一个分支,我们称之为分离HEAD状态
bash
git switch -d f8c540805b7e16753c65619ca3d7514178353f39
只需要加上-d参数就可以了,而checkout是不需要加-d的,在switch里一切变得明确了很多
如果要合并一个分支必须加上-b
bash
git switch -b dev
创建分支则是-c
bash
git switch -c dev
git restore命令是用来撤销提交与修改的,如:
bash
git restore file
使用这条命令会将文件从暂存区删除
bash
git restore file
这条命令会不会将文件从暂存区里删除,会将文件在暂存区里的状态覆盖到工作区,如我在工作区对这个文件又进行了修改,那么使用这个命令可以将这个文件在暂存区里的内容恢复到工作区
命令总结
创建
#克隆现有存储库
git clone ssh://user@domain.com/repo.git
#创建一个新的本地存储库
git init
当地变化
#工作目录中已更改的文件
git status
#跟踪文件的更改
git diff
#将所有当前更改添加到下一个提交
git add .
#在中添加一些更改到下一次提交
git add -p
#提交跟踪文件中的所有本地更改
git commit -a
#提交先前进行的更改
git commit
#更改最后一次提交
#不要修改已发布的提交!
git commit --amend
提交历史
#显示所有提交,从最新开始
git log
#显示特定文件随时间的变化e
git log -p
#谁更改了中的内容和时间
git blame
分支机构和标签
#列出所有现有分支
git branch -av
#切换HEAD分支
git checkout
#根据您当前的HEAD创建一个新分支
git branch
#基于远程分支创建一个新的跟踪分支
git checkout --track
#删除本地分支
git branch -d
#用标签标记当前提交
git tag
更新和发布
#列出所有当前配置的遥控器
git remote -v
#显示有关遥控器的信息
git remote show
#添加名为的新远程存储库
git remote add
#从下载所有更改,但不要集成到HEAD中
git fetch
#下载更改并直接合并/集成到HEAD中
git pull
#在远程上发布本地更改
git push
#删除遥控器上的分支
git branch -dr
#发布标签
git push --tags
合并与基础
#将合并到当前HEAD中
git merge
#将当前的HEAD重新设置到 不要重新发布已发布的提交!
git rebase
#中止基准
git rebase --abort
#解决冲突后继续进行基准
git rebase --continue
#使用您配置的合并工具解决冲突
git mergetool
#使用编辑器手动解决冲突,并(在解决之后)将文件标记为已解决
git add
git rm
撤消
#丢弃工作目录中的所有本地更改
git reset --hard HEAD
#放弃特定文件中的本地更改
git checkout HEAD
#还原提交(通过产生具有相反更改的新提交)
git revert
#将HEAD指针重置为上一次提交 ...并丢弃此后的所有更改
git reset --hard
#...并将所有更改保留为未分阶段的更改
git reset
#...并保留未提交的本地更改
git reset --keep
提交相关更改
提交应该是相关更改的包装。 例如,修复两个不同的错误应产生两个单独的提交。 小型提交使其他开发人员更容易理解更改,并在出现问题时将其回滚。 借助暂存区等工具以及仅暂存文件部分的功能,Git使得创建非常精细的提交变得容易。
经常提交
提交通常会使您的提交变小,并且再次帮助您仅提交相关的更改。 而且,它使您可以更频繁地与他人共享代码。 这样,每个人都可以更轻松地定期集成更改,避免合并冲突。 相比之下,大型提交很少且很少共享,因此很难解决冲突。
不要做半成品
您只应在完成代码后提交代码。 这并不意味着您在提交之前必须先完成一个完整的大型功能。 恰恰相反:将功能的实现分成逻辑块,并记住提早并经常提交。 但是,不要承诺在一天结束离开办公室之前在存储库中存放一些东西。 如果您只是因为需要干净的工作副本(来签出分支,进行更改等)而打算提交,请考虑改用Git的"隐藏"功能。
提交之前的测试代码
抵制诱惑,以完成您"认为"的事情。 对其进行彻底的测试,以确保它确实完成并且没有副作用(据人们所知)。 虽然只需要原谅自己在本地存储库中提交的东西,但是在与他人推送/共享代码时,测试代码就显得尤为重要。
写好的提交信息
首先以简短的更改摘要(最多50个字符为准则)开始您的消息。 通过包含空白行将其与后续正文分开。 邮件正文应提供以下问题的详细答案:
›改变的动机是什么?
›它与以前的实现有何不同?
使用命令式现在时态(" change",而不是" changed"或" changes")与git merge等命令生成的消息保持一致。
版本控制不是备份系统
将文件备份到远程服务器上是拥有版本控制系统的一个很好的副作用。 但是,您不应像将其用作备份系统那样使用VCS。 在进行版本控制时,您应注意语义上的提交(请参阅"相关更改")-您不应该只是在文件中塞入。
使用分支
分支是Git最强大的功能之一-并不是偶然的:从一开始,快速便捷的分支就成为了中心需求。 分支是完美的工具,可帮助您避免混淆不同的开发路线。 您应该在开发工作流程中广泛使用分支:有关新功能,错误修复,想法...
同意工作流程
Git让您从许多不同的工作流程中进行选择:长期运行的分支,主题分支,合并或重新设置,git-flow...您选择哪个取决于两个因素:项目,整体开发和部署工作流程以及(也许 最重要的是),以了解您和您的队友的个人喜好。 无论您选择工作,只要确保在每个人都遵循的通用工作流程上达成一致即可。
帮助和文档
在命令行获取帮助
$ git help
成您"认为"的事情。 对其进行彻底的测试,以确保它确实完成并且没有副作用(据人们所知)。 虽然只需要原谅自己在本地存储库中提交的东西,但是在与他人推送/共享代码时,测试代码就显得尤为重要。
写好的提交信息
首先以简短的更改摘要(最多50个字符为准则)开始您的消息。 通过包含空白行将其与后续正文分开。 邮件正文应提供以下问题的详细答案:
›改变的动机是什么?
›它与以前的实现有何不同?
使用命令式现在时态(" change",而不是" changed"或" changes")与git merge等命令生成的消息保持一致。
版本控制不是备份系统
将文件备份到远程服务器上是拥有版本控制系统的一个很好的副作用。 但是,您不应像将其用作备份系统那样使用VCS。 在进行版本控制时,您应注意语义上的提交(请参阅"相关更改")-您不应该只是在文件中塞入。
使用分支
分支是Git最强大的功能之一-并不是偶然的:从一开始,快速便捷的分支就成为了中心需求。 分支是完美的工具,可帮助您避免混淆不同的开发路线。 您应该在开发工作流程中广泛使用分支:有关新功能,错误修复,想法...
同意工作流程
Git让您从许多不同的工作流程中进行选择:长期运行的分支,主题分支,合并或重新设置,git-flow...您选择哪个取决于两个因素:项目,整体开发和部署工作流程以及(也许 最重要的是),以了解您和您的队友的个人喜好。 无论您选择工作,只要确保在每个人都遵循的通用工作流程上达成一致即可。
帮助和文档
在命令行获取帮助
$ git help