为了让大家更容易理解git ,先来一张大图
因为使用git 命令行来提交代码的,所以此文章用来记录一些常用的命令,因为老是忘记一些命令(SourceTree的除外)
cd D(指定切入到哪一个盘)
dir (查看文件夹中的文件和文件夹)
:q (退出当前命令行)
现在开始提交代码的命令(克隆线上仓库)
1.切入到指定的文件夹中
2.git clone url(线上仓库的地址)
git status //查看当前仓库和线上仓库有什么不一样
git add . //将修改的东西提交到本地的暂缓区
git -m "第一次提交" //将暂缓区的内容提交我本地的仓库
git pull 将线上的资源拉到本地的仓库
git push 将本地仓库的内容推送到线上残酷
-------------------------------------------------------------------------------------------------------------------------------
git查看分支
git branch //查看本地有哪些分支
git branch -r //查看线上仓库有那些分支
git branch -a //查看线上和本地所有的分支
git 创建和删除分支
git branch 分支名 //创建本地分支
(先创建本地分支:
git branch 分支名 ,然后执行 git push origin 分支名 //这一句是将本地创建的分支及分支内的内容推送到线上仓库,此时本地的分支名为线上的分支名,
如果想线上仓库名不一样可以通过如下方法:
git push origin 本地分支名:线上分支名(需要创建的分支名) ) //创建远程分支
git branch -d 分支名 //删除本地分支名
git push origin --delete <分支名称>
//删除线上分支
git checkout 分支名 //切换本地分支
git本地分支如何与线上分支绑定
如果当我们执行完把本地分支推送到线上仓库时,执行git pull 和git push 发现会发现出现如下错误:
那是因为我们本地分支没有与线上分支相关联,所以我们执行上面的要求
git push --set-upstream origin 线上分支名,就可以了
git将本地分支和线上分支绑定
git checkout 本地分支
git push --set-upstream origin 线上分支名,就可以了
如何将本地的分支推送到线上呢?
git push origin 分支名 //这一句是将本地创建的分支及分支内的内容推送到线上仓库,线上仓库的名称为分支名,
如果想线上仓库名不一样可以通过如下方法:
git push origin 本地分支名:线上分支名(需要创建的分支名)
如何将提交打上tag呢
有些时候为了标识发行版本(release)和测试版本(apha)
git tag //获得当前分支下所有的tag
git tag -a <版本号> -m "tag的说明" //给提交的版本号tag (版本号,为这次tag的版本)
推送tag
推送所有标签
git push origin --tags
- 1
推送指定版本的标签
git push origin <版本号>
上面说的版本号是什么呢?
就是我没每次git push 的时候github就会生成一个标识就是版本号
如何获得版本号呢?可以在GitHub上查看
也可以用git 命令查看
git log 查看最近的提交记录 红色箭头标识的是版本号,蓝色标识的是当前的版本号
git show log 查看某一条提交的详细信息
git push origin --tags //推送分支到线上
git tag -d 版本号 //删除本地的分支
git push origin :refs/tags/<版本号> //新旧通吃的git
git push origin --delete <版本号> //这是新版本的git
如何合并分支呢?
加入将 1.1.2版本的合并到master主支上
先切换到master主支上
git checkout master //切换到主支上
git merge 1.1.2 //将1.1.2分支上的内容合并到master上
git merge --abort # 取消当前合并,重建合并前状态
git merge dev -Xtheirs # 以合并dev分支到当前分支,有冲突则以dev分支为准
git rebase <branch> # 衍合指定分支到当前分支
假如某一天有一次提交有bug 想回到之前的版本如何解决呢?
背景理解
git的版本管理,及HEAD的理解
使用git的每次提交,Git都会自动把它们串成一条时间线,这条时间线就是一个分支。如果没有新建分支,那么只有一条时间线,即只有一个分支,在Git里,这个分支叫主分支,即master分支。有一个HEAD指针指向当前分支(只有一个分支的情况下会指向master,而master是指向最新提交)。每个版本都会有自己的版本信息,如特有的版本号、版本名等。如下图,假设只有一个分支:
git reset --hard 目标版本号 //回退到指定的版本号
如何将线上分支上的内容直接拉到本地
git checkout -b 本地分支名x origin/远程分支名x //这个命令可以解决
一、查看远程分支
使用如下git命令查看所有远程分支:
git branch -r
查看远程和本地所有分支:git branch -a
查看本地分支:git branch
在输出结果中,前面带*
的是当前分支。
二、拉取远程分支并创建本地分支
方法一
使用如下命令:
git checkout -b 本地分支名x origin/远程分支名x
使用该方式会在本地新建分支x,并自动切换到该本地分支x。
采用此种方法建立的本地分支会和远程分支建立映射关系。
方式二
使用如下命令:
git fetch origin 远程分支名x:本地分支名x
使用该方式会在本地新建分支x,但是不会自动切换到该本地分支x,需要手动checkout。
采用此种方法建立的本地分支不会和远程分支建立映射关系。
三、本地分支和远程分支建立映射关系的作用
建立本地分支与远程分支的映射关系(或者为跟踪关系track)。
这样使用git pull或者git push时就不必每次都要指定从远程的哪个分支拉取合并和推送到远程的哪个分支了。git branch -vv
输出:
上面的本地分支和远程分支都有映射关系,如果没有,就需要手动建立:git branch -u origin/分支名
,
或者git branch --set-upstream-to origin/分支名
origin
为git地址的标志,可以建立当前分支与远程分支的映射关系。
撤销本地分支与远程分支的映射关系
git branch --unset-upstream
之后可以再次用git branch -vv
查看本地分支和远程分支映射关系
问题思考:本地分支只能跟踪远程的同名分支吗?
答案是否定的,本地分支可以与远程不同名的分支建立映射关系
操作和之前的一样,只是可以指定和本地分支名不同的远程分支名,然后使用git branch -vv
查看映射关系,可以发现建立映射成功
git拉取远程分支并创建本地分支_zhangxiaoyang0的专栏-CSDN博客_基于远程分支新建本地分支 这篇博客讲的更为仔细
以上是一些常用到git命令
git diff 分支1 分支2 //查看两个分支具体内容的区别
git diff 分支1 分支2 --name-status //查看两个分支内容不同的列表
git diff log1 log2 //查看两个log不相同的内容
git log -p -数字 //显示最近 数字 的提交详细
暂存当前未开发完成的代码,很实用
当新功能的代码写到一半,甚至还有报错,突然线上有紧急bug需要修复,需要在其他分支上修改代码。这时由于当前分支代码变动但是未提交(功能不完整或者报错,最好不要直接提交代码),无法直接切换到目标分支,解决的办法就是
1.把代码暂时锁定在当前分支的本地缓存区
git stash
2.锁定完成后就可以切换到其他分支修改代码了,结束后随时再切回原来开发的分支(开发到一半的代码还看不到),然后解除代码本地锁定(开发到一半的代码可见了),继续未完成的代码开发
git stash pop
所以完整的提交流程应该是
1.git diff 查看文件文件变化
2.git add .(提交到缓存仓库)
3.git commit (提交本地仓库)
4.git pull(拉线上的代码)
5.git push (解决冲突,上传线上仓库)
git 如何绑定多个远程仓库:
首先,先增加第一个地址 git remote add origin https://git.oschina.net/shede333/swioslibary.git
然后增加第二个地址 git remote set-url --add origin https://git.oschina.net/shede333/swscrollbar.git
增加第三个地址 git remote set-url --add origin https://github.com/shede333/CoreAnimationTestSW.git
….依次类推
这样git push 之后就三个仓库都有了
如果你在本地使用`git clone`下载项目,但是发现项目中的某些文件是空的,那么可能是因为这些文件是git子模块。Git子模块允许你在一个仓库中包含另一个仓库。
你可以使用以下命令来初始化和更新子模块:
git submodule init
git submodule update
如果你想要克隆一个包含子模块的仓库,你可以使用`--recurse-submodules`选项:
git clone --recurse-submodules <repo>
这将会克隆仓库和所有的子模块。
如果你已经克隆了仓库,但是忘记了使用`--recurse-submodules`选项,你可以运行以下命令:
```bash
git submodule update --init --recursive
```
这将会初始化和更新所有的子模块。
如果你的代码是放在别的仓库的,你可能需要将那个仓库也克隆到本地,或者将那个仓库作为一个子模块添加到你的项目中。