目录
在VS Code中使用Git和管理Github
项目推送到远程仓库
推送前需要设置好全局git
git config --global user.name "GDUT-Kyle"
git config --global user.email "123*****@qq.com"
在github或gitee新建好远程仓库后,让本地仓库与其产生联系
# 没有本地仓库的情况下
mkdir vscode_git
cd vscode_git
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin https://gitee.com/zhao_jia_jun/vscode_git.git
git push -u origin master
# 已经存在本地仓库的情况下
cd existing_git_repo
git remote add origin https://gitee.com/zhao_jia_jun/vscode_git.git
git push -u origin master
使用vscode 打开项目:
打开下面视图,添加一行文字## 测试提交
点击+
;相当于git add .
如果点击单个文件的+
,即仅添加该修改
点击打勾
;等于git commit -m "备注信息"
;右边的箭头输入需要备注的信息。然后按Enter
确定。
回车之后,然后我们可以看到。所有的修改的文件,均已经提交到缓存区。1变成了 0;
撤销上一次commit
:有的时候我们一不小心就git commit -m ‘commit message info’
解决办法,很简单,只需执行git reset HEAD~
这条命令即可,即能保证你原本的修改还在,也能撤销本次提交失误。这种撤销上一次提交是比较好的,如果是版本回退的话也能解决这个问题,但是版本回退只适合于你本次提交并没有改动什么或者改动不大的情况。如果你改动太多,版本回退意味着着你需要重新复制一遍,当然了,解决这种问题的办法有很多,分支开发的方式也能解决这种问题。在vscode中的操作如下:
提交到远程仓库;git push origin master
到git仓库里面;查看。已经成功提交。
使用vscode解决冲突
在使用git的时候,经常会遇到冲突;这里简单的说明,如何使用vscode来解决冲突。
大家在提交代码的时候,一定要先拉取代码;不然就会造成冲突;
拉取代码 git pull origin master
我们在不同地方再拉去一次项目,然后分别在没有git pull
的情况下在两个本地仓库中修改:
然后分别将两个仓库进行git push
,提交到远程仓库的时候,这时候会报错
拉去远程代码,可以在vscode中查看冲突
然后可以选择保留哪一次更改:
合并完后重新commit
并push
上去。
忽略文件
在仓库目录下创建一个名为.gitignore
的文件,列出要忽略的文件模式:
target //忽略这个target目录
angular.json //忽略这个angular.json文件
log/* //忽略log下的所有文件
css/*.css //忽略css目录下的.css文件
*.[oa] // 忽略所有以.o或.a结尾的文件
*~ // 忽略所有以~的文件
文件.gitignore
可以使用标准的glob模式匹配
- 星号(
*
)匹配零个或多个任意字符; [abc]
匹配任何一个列在方括号中的字符;- 问号(
?
)只匹配一个任意字符 [0-9]
或[a-z]
等表示所有在这两个字符范围内的字符- 使用两个星号(
*
)表示匹配任意中间目录,比如a/**/z
可以匹配a/z
,a/b/z
或a/b/c/z
等
# no .a file
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf
在使用git的时候会遇到这样的情况,我们生产的一些class或者target的目录,我不能提交,这个时候我们需要使用gitignore,但是有的时候虽然添加了,但是不起作用。
情况:开发过程中,我们自己会在gitignore 文件中添加一些忽略项,然而,每次使用git status 的时候都未列在 untracked里面,比如用IDEA 开发,.idea 文件夹添加到该文件,再提交还是会提示。
原因:新建的文件在git中会有缓存,如果某些文件已经被纳入了版本管理中,就算是在.gitignore中已经声明了忽略路径也是不起作用的,这时候我们就应该先把本地缓存删除,然后再进行git的push,这样就不会出现忽略的文件了。git清除本地缓存命令如下:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
移除文件
- 从工作目录中手工删除文件,并且从已跟踪文件清单中移除该文件
rm file.md
git rm file.md
下一次提交时,该文件就不在纳入版本管理。如果删除之前修改过并且已经放入暂存区域的话,则必须要用强制删除选项-f
。
- 我们想把文件从git仓库中删除(亦即从暂存区移除),但仍然希望保留在当前工作目录中。换句话说,文件保留在磁盘,但是并不想让git跟踪。可以使用
.gitignore
,也可以使用--cached
git rm --cached file.md
取消暂存的文件
如果我们已经使用git add file.md
暂存了新的修改,但是后来发现该修改仍存在问题,需要撤销,则可以使用取消暂存操作:
git reset HEAD file.md
在vs code中的操作如下:
点击+
暂存修改
查看git status
点击-
撤销暂存:
查看git status
commit补充文件
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。此时,可以运行带有--amend
选项的提交命令尝试重新提交:
例如:
git commit -m 'initial commit'
git add forgotten_file
git commit --amend
最终只会有一个提交,第二次提交将代替第一次提交的结果。
分支创建
指令:
git branch testing
这会在当前所在的提交对象上(HEAD
)创建一个指针。值得注意得失,当前仍然在master
分支上,因为git branch
仅仅创建一个新分支,并不会自动切换到新分支中去。
可以简单地使用git log
命令查看各个分支当前所指的对象。提供这一功能的参数是--decorate
在vscode中创建分支的操作:
输入创建的分支名
分支切换
首先可以使用git log --oneline --decorate
查看当前指向哪个分支:
要切换到一个已存在的分支,需要使用git checkout
命令。现在切换到新创建的testing
分支去:
git checkout testing
这样HEAD
就指向testing
分支了。
再次查看当前指向哪个分支
可以看出,当前HEAD
指向testing
分支。
可以使用一条指令同时完成分支的创建和切换:
git checkout -b testing
它是下面两条指令的简写:
git branch testing
git checkout testing
使用vscode完成分支切换的操作:
选择相应的分支即可(或者可以新建分支):
下面不妨做个实验,在分支稍微做些修改并提交:
首先切换到新创建的分支,加一行修改后,常规地进行commit
和push
之后在远程仓库中可以看到有新的分支:
分支合并
这个时候如果突然发现master存在一个BUG,需要我们回过头去修复的时候,应该切换回master
去:
我们假设新建一个.cpp
文件即可修复该BUG,我们可以先基于master
新建一个分支hotfire
,然后在该分支下新建文件:
解决该BUG后,我们需要发布修订版,就是把master
指针挪到hotfire
位置,也就是合并分支:
git checkout master
git merge hotfire
vscode 中的操作如下:
首先切换回master
下:
选择合并分支:
接着master
下也多了一个hotfire.cpp
了。
使用指令查看当前的分支图:
git log --graph --decorate --oneline --simplify-by-decoration --all
由于当前master
分支所指向的提交是当前提交(有关hotfire
的提交)的直接上游,所以git只是简单的将指针向前移动。
现在关于hotfire
的BUG问题已经解决后,我们应该先删除hotfire
分支,因为我们已经不再需要它(master
已经替代了它)——master
分支已经指向了同一位置。
git branch -d hotfire
git fetch & pull的区别
git fetch
是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
而git pull
则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge
,这样可能会产生冲突,需要手动解决。