Git基础命令快查
以下代码文件路径以src/index.js
来作为演示
快查
Git Log
# git log查找指定日期提交记录
git log --after="2021-04-12" --before="2021-04-13"
Git COMMIT
暂存区的代码提交给本地版本库(-m代表message,不输入无法输入备注)
git commit -m "message"
可以将所有已跟踪文件中修改或删除的提交到本地仓库,不建议直接这样使用(加上-a代表git add)
git commit -a -m "message"
分支
查看远程分支
git branch -a
查看本地分支
git branch
切换分支
git checkout -b dev origin/dev
远程仓库里拉取一条本地不存在的分支
git checkout -b 本地分支名 origin/远程分支名
fork出来的分支与原项目合并
## 从上游仓库获取到分支,及相关的提交信息,它们将被保存在本地的 upstream/master分支
git remote add upstream git@github.com:original_owner/original_repository.git
git fetch upstream
## 在你本地的 master 分支上,将合并后的信息提交
git merge upstream/master
git commit -m "message"
## push 到你远程的仓库
git push origin master
Fork项目后和原项目进行同步更新
## 查看原有远程分支信息
git remote -v
## 添加源项目的远程分支并命名为upgrade,名称随意
git remote add upgrade https://github.com/origin/projectname.git
## 再次查看本地的远程分支信息,这时已经可以看到远程分支已经添加进去了
git remote -v
## 把upgrade的代码拉取到本地
git fetch upgrade
## 查看并选中dev(默认是选中master),或者其他你想合并的分支,只有一个master分支可以忽略
git branch
## *号就是选中的
> * master
> dev
git checkout -b dev
## 合并upgrade到我们自己的master分支
git merge upgrade/master
## 如果没有提示冲突,直接推送到github仓库,有冲突请继续往下看
git push origin master
撤销
撤销未add添加到暂存区
## 将会撤销当前文件夹下所有文件,也可以指定到某个文件
git checkout -- .
撤销已经add的代码
## 如果后面什么都不跟的话 就是上一次add 里面的全部撤销了
git reset HEAD
修改已经commit的注释
git commit --amend
撤销已经commit的代码
## 不删除工作空间的改动代码 ,撤销commit
git reset --soft "HEAD^"
## 删除工作空间的改动代码,撤销commit且撤销add
git reset --hard "HEAD^"
git revert撤销已经push的代码
## 查看提交日志,并找到某次提交的commit-id,退出按下Q
git log
## 然后撤销执行commit-id的提交
git revert <commit-id>
git reset撤销已经push的代码
## reset操作会将之前的记录删除,比较危险,请注意
git log //查看提交日志,并找到某次提交的commit-id,退出按下Q
git reset --hard <commit-id> //然后撤销执行commit-id的提交
git push origin //推送至远程分支
撤销add到缓存区的更改
## 先看一下add 中的文件
git status
## 后面什么都不跟的话 就是上一次add 里面的全部撤销了
git reset HEAD
## 对指定文件进行撤销了
git reset HEAD src/index.js
教程
git 本地创建分支,推送到远程
- git branch (查看本地分支)
- git branch -a (查看远程端的查分支命令)
- git checkout -b branch1 (创建分支: 本地多了branch1 ,远程端分支还不变)
- cat test.txt (运行文件)
- git status ( 查看状态,当前是没有提交任何东西)
- vim test.txt (编辑txt 文件)
- git add test.txt
- git commit -m "提交到分支1上的内容"
- git push --set-upstream origin branch1
添加.gitignore
- 手动创建.gitignore
- 将不需上传的文件写入,例如:node_modules/
- 提交记录
git commit -m "add .gitignore"
- 推送远端
git push
如何 clone git 项目到一个非空目录
如果我们往一个非空的目录下 clone git 项目,就会提示错误信息:
fatal: destination path '.' already exists and is not an empty directory.
解决的办法是:
- 进入非空目录,假设是 /workdir/proj1
- git clone --no-checkout https://github.com/origin/projectname.git tmp
- mv tmp/.git #将 tmp 目录下的 .git 目录移到当前目录
- rmdir tmp
- git reset --hard HEAD
然后就可以进行各种正常操作了。
嵌套git仓库(git submodule子模块)
添加子模块
运行成功后子模块就添加到项目了,且会自动新增.gitmodules文件,内部记录了子模块的信息
git submodule add <repoUrl> <directory name>
如果子模块添加后,文件夹内没有文件,可以执行
git submodule update --init --recursive
更新子模块
当子模块有更新时,在主仓库需要更新一下远程子模块代码
git submodule update --remote
删除子模块
git submodule没有提供删除子模块的命令,需要自己手动删一下,并且要删除的地方有点多,不要漏了
第一步:删除子模块文件夹rm -rf 子模块目录名
第二步:删除.gitmodules里的子模块的信息
第三步:删除.git/modules/子模块名cd ./.git/modules/
rm -rf 子模块目录名
第四步:删除.git/config里的子模块配置信息vi .git/config
进入编辑模式,删除子模块相关信息(这里建议不熟悉VI命令的直接用IDE编辑器打开)
以上,就删除成功啦
tips:
如果以上都删除了,还是不能添加的话,就删除一下缓存吧git rm --cached 子模块目录名
参考:https://blog.csdn.net/haoyanyu_/article/details/119857693
问题
git bash使用时,无法正确显示中文命名文件
解决1:
git bash 终端输入命令:git config --global core.quotepath false
如果还是出现乱码,bash终端也要设置成中文和utf-8编码。
解决2:
右击bash终端的空白处,然后:Options->Text->Locale改为zh_CN,Character set改为UTF-8
解决3:
还有一种情况出现乱码而且上面的方法解决不了的,就是你windows安装git bash的时候框选了字体,然后你系统中没有那个字体导致。这种情况下只能先卸载git bash,重装不要选字体。
当然区分这两种情况很简单,没有字体那种实际上敲ls命令查看的时候还是能看到中文的,但在git status的时候就会出现乱码。
路径下C:\Program Files\Git\etc,
编辑profile文件,在文件末尾添加如下内容:
export LESSHARESET=utf-8
参考:https://blog.csdn.net/u012145252/article/details/81775362
解决 The file will have its original line endings in your working directory
首先出现这个问题主要原因是:我们从别人github地址上通过git clone下载下来,而又想git push到我们自己的github上,那么就会出现上面提示的错误信息
git rm -r --cached .
git config core.autocrlf false
git add .
warning: LF will be replaced by CRLF
简单解决的办法就是crtl+enter换行就不会报错了,相关解决方案:git如何避免”warning: LF will be replaced by CRLF“提示?
Git stash save "message"无法使用
实际上是因为我在webstorm客户端操作,并使用任务管理器删除
git reset --hard commit_id如何恢复?
git reflog
可以看到每次对目录树的操作日志,HEAD@{1}为最近提交操作的序号,前面的hash值就是commit_id。git reset --hard commit_id
回退到HEAD@{1}这个版本
git reset操作一定要谨慎
解决git push代码到github上一直提示输入用户名及密码的问题
问题:
将github上的工程clone到本地后,修改完代码后想要push到github,但一直会有提示输入用户名及密码。
分析:
git clone的时候使用的是http的方式,自然git push的时候也是这样。
解决:
- 先查看当前方式:
git remote -v
- 把http方式改为ssh方式。先移除旧的http的origin:
git remote rm origin
- 再添加新的ssh方式的origin:
git remote add origin git@github.com:6-6/myblog.git
- 检查一下有没改变成功:
git remote -v
- 改动完之后直接执行git push是无法推送代码的,需要设置一下上游要跟踪的分支,与此同时会自动执行一次git push命令。
git push --set-upstream origin dev
(注意这里的分支改为自己指定的分支)
Untracked files无法直接用checkout清除
$ git status
On branch main
Your branch is up to date with 'origin/main'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
JavaScript/EcmaScript6/chapter1/
nothing added to commit but untracked files present (use "git add" to track)
git clean -f -d
冲突后无法git pull
error: Pulling is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: Exiting because of an unresolved conflict.
部分参考: