git笔记
绑定用户
git config --global user.name "Taury"
git config --global user.email "183********@163.com"
本地生成ssh key 并添加到gitee
ssh-keygen -t rsa -C "183********@163.com"
cat ~/.ssh/id_rsa.pub
ssh -T git@gitee.com #添加主机到本机SSH可信列表
若添加公钥后仍需要输入用户名和密码,则修改连接方式为ssh
已克隆的仓库修改 .git/config 文件中 url=https://gitee.com/Name/project.git 为 url=git@gitee.com:Name/project.git
创建本地仓库
git init
克隆仓库到本地
ssh 方式:git clone git@github.com:Taury/monamie.git [dst_dir] /* 本地目录不可以是仓库 */
https方式:git clone https://github.com/Taury/monamie.git [dst_dir]
克隆子模块
git submodule update --inint
添加文件到缓存
git add <file> /* git add . 将当前目录下所有为未跟踪的文件全部添加到缓存 */
git reset HEAD <file> /*取消已缓存的文件*/
提交文件到仓库
git commit [file] -m "备注"
git rm <file> /*从仓库中移除文件*/
git rm -f <file> /*删除之前修改过并且已经放到暂存区域的文件 */
关联远程仓库
git remote add orgin git@github.com:Taury/monamie.git
查看关联的远程仓库
git remote -v
上传本地代码到远程仓库
git push -u origin master /* 注意:github不能管理空文件夹 */
分支
获取当前分支名称
git rev-parse --abbrev-ref HEAD
查看所有分支(包括远程分支)
git branch -v
查看远程分支
git branch -r
创建分支
git branch [分支名] #仅创建分支
git checkout -b [分支名] #创建分支并切换到新分支
删除分支
git branch -d [分支名]
切换分支
注:git add, git commit之后更改内容才保存到分支
git checkout [分支名]
同步分支文件
git checkout branch2 #当前分支为branch2
git checkout branch1 file #同步branch1分支中的file文件到branch2分支上
版本回退
git reset HEAD^ #回退所有内容到上一个版本
git reset HEAD^^ #回退所有内容到上上一个版本
git reset HEAD^^^ #回退所有内容到上上上一个版本
...
git reset HEAD~1 #回退所有内容到上一个版本
...
git reset HEAD^ file #回退file文件的版本到上一个版本
git reset --hard [版本号] #回退之前某个版本
拉取
git pull origin master
- 浅克隆:拉取最近一次的变更,忽略以前的变更记录,在拉取时可以加参数depth,如
git pull --depth=1 origin master
稀疏检出
稀疏检出(sparse checkout ): 只获取部分目录的内容 (参考文章)
# 打开sparse checkout功能
git config core.sparsecheckout true
# 添加2个目录到checkout的列表。路径是版本库下的相对路径
echo "path1/" >> .git/info/sparse-checkout
echo "path2/" >> .git/info/sparse-checkout
# 更新checkout的列表
git checkout master
或者
git read-tree -mu HEAD
关闭sparse checkout功能:
仅修改core.sparsecheckout为false是不生效的,
需要修改 .git/info/sparse-checkout 文件,用一个”*“号替代其中的内容,
然后执行 checkout 或 read-tree 命令。
sparse-checkout 文件设置
-
子目录的匹配
在 sparse-checkout 文件中,如果目录名称前带斜杠,如/docs/,将只匹配项目根目录下的docs目录,如果目录名称前不带斜杠,如docs/,其他目录下如果也有这个名称的目录,如test/docs/也能被匹配。
而如果写了多级目录,如docs/05/,则不管前面是否带有斜杠,都只匹配项目根目录下的目录,如test/docs/05/不能被匹配。 -
通配符 "*" (星号)
在 sparse-checkout文件中,支持通配符 "*",如可以写成以下格式:
- *docs/
- index.*
- *.gif
- 排除项 “!” (感叹号)
在 sparse-checkout 文件中,也支持排除项 “!”,如只想排除排除项目下的 “docs” 目录,可以按如下格式写:
- /*
- !/docs/
注:如果要关闭sparsecheckout功能,全取整个项目库,可以写一个"*"号,但如果有排除项,必须写"/*",同时排除项要写在通配符后面。
报错解决:
git rm --cached [file]: 从stage(index,暂存区) 里面删除文件,当你提交(commit)之后文件就会删除了。
git reset HEAD [file]: 回退暂存区里的文件(还原为HEAD commit里面该文件的状态),会撤销从上一次提交(commit)之后的一些操作。
如果是对于新增文件,这两个操作时等效的。
这两个命令都是对stage,index的操作。
git rm和rm的区别
用 git rm 来删除文件,执行 git commit -m [file] 提交时会将这个删除操作记录下来;
用 rm 来删除文件,仅仅是删除了物理文件,使用 git commit -am [file] 提交才会将删除文件的操作提交上去。
git push 时报错,error: failed to push some refs to
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:Taury/CHAT.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
是因为远程repository和本地的repository冲突导致的,在创建版本库后,添加了README.md,但是却没有pull到本地。
解决方法:
1.使用强制push的方法:(不可取,会造成远程修改丢失)
$ git push -u origin master -f
2.push前先将远程repository修改pull下来
$ git pull origin master
$ git push -u origin master
3.若不想merge远程和本地修改,可以先创建新的分支后再push
$ git branch [name]
$ git push -u origin [name]
如果是使用vmware安装的linux系统,由于共享文件夹文件系统与linux系统的文件系统的差异,不支持创建硬链接等操作的原因,在共享目录下进行git clone等操作会报以下错误:
fatal: 'origin' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.
当git add -A时出现warning: LF will be replaced by CRLF问题
原因:由于编辑器的不同或者文件行尾的换行符在 Windows 下被替换了
- Dos和Windows平台: 使用回车(CR)和换行(LF)两个字符来结束一行,回车+换行(CR+LF),即“\r\n”;
- Mac 和 Linux平台:只使用换行(LF)一个字符来结束一行,即“\n”;
解决方法:
git config --global core.autocrlf true
git pull时出现error: cannot lock ref 'refs/remotes/origin/xxx 错误:
原因:本地分支和远程分支的引用关系被破坏了
解决方法:
- 方法1:
# 更新reference
git update-ref -d refs/remotes/origin/[locked branch name]
# 拉取代码
git pull
- 方法2:
#删除掉 .git 目录下 分支 文件
rm .git/refs/remotes/origin/xxx
# 拉取代码
git pull
fatal: detected dubious ownership in repository at '/xxx/yyy'
解决方法:
- 方法1:修改文件的所有者
sudo chown zz /xxx/yyy -R
sudo chgrp zz /xxx/yyy -R
- 方法2:手动禁用安全目录
git config --global --add safe.directory /xxx/yyy