拉取代码
拉取master主支代码
git clone https://github.com/JustDoIt521/web-Tetris.git
拉取指定分支代码
我们假设拉取test分支的代码
git clone -b test https://github.com/JustDoIt521/web-Tetris.git
拉取远程分支并合并到当前分支
git pull origin test
拉取远程分支 并切换到该分支(不于当前分支合并)
方法1
git checkout -b 本地分支名 origin/远程分支名
方法2
git checkout --track origin/远程分支名 (这种写法是上面的简化版,效果完全一样)
方法3
git checkout -t origin/test (方法2简化版)
查看及切换分支
查看当前分支
git branch // 显示本地的所有分支 *代表当前分支
git branch -a // 查看所有分支 包含本地和远程仓库分支
切换指定分支
如果切换到已有分支dev
git checkout dev
如果没有分支,我们想新建一个分支dev1并切换至该分支
git branch dev1
git checkout dev1
// 可以将上面两行简写为如下方式
git checkout -b dev1
切换到远程分支
假设我们在控制台输入 git branch -a 结果如下
h18_ticket
* master
remotes/origin/dev
remotes/origin/tools
我们想切换至远程分支tools, 该方法也适合拉取远程分支代码
git checkout -b tools origin/tools
该命令会建立一个本地仓库tools 和远程仓库tools的映射关系。并将远程仓库tools分支的代码拉到本地tools分支。
当然我们可以将本地分支明明为其他任何你喜欢的名字,只要不和本地已有分支的名字冲突
建议是保持本地分支和远程分支的名字一致,防止混乱
如果我们想查看下本地分支和远程分支的对应关系
git branch -vv // 列出本地分支 和其所对应的远程分支
提交代码
提交到主支
git init // 初始化 生成git目录
git add -A // 添加本次修改的所有代码
git commit -m '第一次提交' // 填写本次提交的信息
git push // 将代码提交至远程仓库
提交到对应分支
假设我们现在在test分支下开发,我们要将代码push到test分支对应的远端仓库
.....
git push origin test
提交指定文件
假设我们只想提交README.md文件的修改
git add README.md
提交某一类文件
// 将src目录下所有的*.vue文件的修改添加到暂存区
git add src/*.vue
// 将以dialog结尾的文件的所有修改添加到暂存区
git add *dialog
删除分支
删除本地分支
我们首先要切换至其他分支
git branch -d dev // 删除本地dev分支
删除远程分支
git push orgin --delete deb // 删除远程仓库分支 dev
合并分支
假设我们将dev分支的代码合并到master分支
git checkout master // 首先切换到master分支
git merge dev // 合并dev分支的修改
暂存修改
git stash // 暂存本次修改的所有内容
git stash pop //使用上一次暂存,并将这个暂存删除,使用该命令后,如果有冲突,终端会显示,如果有冲突需要先解决冲突(这就避免了冲突提交服务器,将冲突留在本地,然后解决)
git stash list // 查看所有暂存
git stash clear // 清除所有暂存
设置忽略
创建名为.gitignore的文件在项目根目录下
要忽略文件未被纳入版本管理
node_modlues //忽略根目录下node_modules下的所有文件
要忽略的文件被纳入版本管理了
比如我们想忽略temp.js
// 移除对temp.js的跟踪。 本地的temp.js并不会被删除
git rm --cached temp.js
// 执行提交代码的操作
git init
...
git push
// 本地的temp.js并不会被删除,但是当我们登录远程仓库的时候,远程仓库的temp.js已经被删除掉了。 如果我们之后再移除对temp.js的忽略,再次提交,git就会重新跟踪temp.js
比较差异
查看本次修改的文件
git status
// 显示结果
On branch game // 所在的分支
Your branch is up to date with 'origin/game'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: src/components/avatar.vue // 所修改的文件
显示文件内被修改的内容
git diff // 默认比较工作区与暂存区的修改
git diff HEAD // 比较工作区和最新本地版本库
如果我们在执行diff操作之前运行了git add -A,则diff不会显示有任何差异,因为此时工作区和暂存区是一样的。
此时如果要查看差异 可以用
git diff --cached // 比较暂存区与最新本地版本库(本地库中最近一次commit的内容)
以上方法均可以加path参数显示指定文件的修改
例如我们想比较src/component/index.vue的文件差异
git diff src/component/index.vue
git diff HEAD src/component/index.vue
git diff --cached src/compoent/index.vue
退出git
按 Esc 键退出编辑模式,英文模式下输入 :wq ,然后回车(write and quit)。
按 Esc 键退出编辑模式,大写英文模式下输入 ZZ ,然后回车
Ctrl + c
打标签
查看所有标签
git tag
创建标签
git tag -a v1.0.0 // 该命令会创建一个名为 v1.0.0的标签,并且git会打开你的编辑器,
让你为这个标签添加注解(如下图)。
git tag -a v1.0.0 -m "first use tag"
// 可以直接添加注释,不需要打开编辑器
推送标签
git push origin --tags // 推送本地所有标签
git push origin v1.0.0 // 推送名为v1.0.0的标签
切换到指定标签
git checkout v1.0.0 //切换到v1.0.0的标签下
删除本地标签
git tag -d v1.0.0 // 删除标签v1.0.0
注意
推送成功后 我们可以在gitlab上通过点击指定标签 看到 对应的压缩包文件
解决冲突
比如我们现在有一个名为testDemo的分支,其中baseApp.js有这样一行代码
console.warn('branch testDemo');
而我们在master分支下 同样baseApp.js下有这样一行代码
console.warn('branch master');
当我们想合并testDemo分支的时候,由于两者都修改了同一个文件,因此会产生冲突。但是不要担心,在执行merge操作的时候,git会给我们标明错误文件和冲突位置。如下图
如果使用vscode,
current Change代表当前分支下修改,incoming Change代表要合并的分支的修改。 我们可以通过选择accept来解决冲突,选择用哪个分支下的代码,也可以自己修改。
之后 我们需要将修改内容暂存到本地
git add baseApp.js
git commit -m '我选择master分支' // 为解决本次冲突提供注释
注意
如果是pull时候产生的冲突,我们可以先暂存本地修改
git stash
然后再拉取代码后,
git stash pop
之后解决冲突方式和前面一样。
多人协作时更新
git pull
(我用的不是很多,后面有新的体会再更新,也欢迎大佬补充)
查看日志
git log // 列出详细日志
git log --oneline // 简化日志
版本回退
通过log命令 我们可以看到历次提交记录,以及对应的 id。 就是commit后面那个,假设我们想要退回的版本id为f45ae0d30ae0045eda526fd2f6daade59f974c2
git reset --hard f45ae0d30ae0045eda526fd2f6daade59f974c2
git push -f -u origin master // 推送到远程服务器
Ps: 其实可以只写id前面的几个字符, 比如上面的f45ae0d即可。 当然字符不可以太短,git会查到很多版本号,就无法确定哪一个。
如果我们只是想退回到上个版本
git reset --hard HEAD^
我们可以一直执行该命令,版本会按照记录,依次往后退。
版本回退后更新
版本回退后更新我们需要使用force命令
git push --force