WebHub icon indicating copy to clipboard operation
WebHub copied to clipboard

Git问题长期收录

Open ckinmind opened this issue 8 years ago • 31 comments

参考资料:阮一峰:常用 Git 命令清单

  1. 查看某个文件夹下的所有更改
  2. 给以前的提交打tag
  3. git提交文件夹大小写的问题
  4. 查看某个文件的所有提交记录
  5. github提交头像变化的问题
  6. 提示 Your branch is ahead of 'origin/new' by 1 commit.
  7. 其他
  8. 如何切换远程分支
  9. 无法git pull的问题
  10. 关于git命令的简写
  11. 关于初始化一个仓库
  12. 基于当前分支创建新的分支,并且提交到远程
  13. 打tag
  14. 合并分支
  15. 删除远程分支和tag
  16. 关于新建本地分支(不提交远程
  17. 回退版本
  18. 添加SSH KEY
  19. 如何clone 一个gist
  20. 如何创建一个空白分支
  21. 放弃本地更改,强制同步线上最新代码
  22. 保持当前分支没提交的代码,然后切换分支
  23. 强制同步本地代码到线上(会强制覆盖)
  24. 更改git仓库地址
  25. 更改git邮箱配置
  26. 错误commit 如何取消
  27. rebase合并多个commit为一个
  28. rebase干净commit提交线
  29. 强制覆盖某个分支(完全舍弃某个分支代码,用另外一个分支)

ckinmind avatar Feb 20 '17 11:02 ckinmind

1. 查看某个文件夹下的所有更改

# 查看所有的更改
git status
# 简写形式
gst 
# 查看某个文件夹下的所有更改(查看actions文件夹下的所有更改)
git status actions

ckinmind avatar Feb 20 '17 11:02 ckinmind

2. 给以前的提交打tag

# 补打标签(tag)
git tag -a v1.0 996a317

# 通常的git push不会将标签对象提交到git服务器,我们需要进行显式的操作
git push origin v1.0

# 7位的校验码可以通过git log或者github中的对应commit提交记录中的full SHA中的头7位
#(就是页面上显示的7位)

补打标签参考资料:git tag — 标签相关操作

ckinmind avatar Feb 20 '17 14:02 ckinmind

3. git提交文件夹大小写的问题

将文件夹大小写改变之后提交后发现github中出现了奇怪的大小写不同的同名文件夹

git config core.ignorecase false

参考资料:如何配置Git支持大小写敏感和修改文件名中大小写字母呢? 参考资料:git设置大小写敏感问题

可是即使这么操作了,github上还是同时存在大小写的问题,暂时不知道怎么解决

解决

先将重名的文件夹移到别的地方,然后提交,相当于删除了对应文件夹,然后再移回来,再提交git

ckinmind avatar Feb 21 '17 14:02 ckinmind

4. 查看某个文件的所有提交记录

git blame [filename]

ckinmind avatar Mar 03 '17 10:03 ckinmind

5. github提交头像变化的问题

自己给自己项目提交的代码,在github的提交记录上怎么不显示我自己的图像呢

改下本地git配置
git config --global user.name "username"
git config --global user.email “[email protected]

ckinmind avatar Mar 08 '17 03:03 ckinmind

6. 提示 Your branch is ahead of 'origin/new' by 1 commit.

意思是你当前的master分支比远程master分支超前1个提交

解决方法(暂缺):

ckinmind avatar Mar 14 '17 15:03 ckinmind

7. 其他

# git remote命令列出所有远程主机
git remote 
origin

上面命令表示,当前只有一台远程主机,叫做origin 克隆版本库的时候,所使用的远程主机自动被Git命名为origin。如果想用其他的主机名,需要用git clone命令的-o选项指定

get fetch
git pull

git pull origin new
# 上面命令表示,取回origin/new分支,再与当前分支合并
# 实质上,这等同于先做git fetch,再做git merge
  1. 一旦远程主机的版本库有了更新,需要将这些更新取回本地,这时就要用到git fetch命令

  2. git fetch命令通常用来查看其他人的进程,因为它取回的代码对你本地的开发代码没有影响

  3. git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并

git push

git push origin new
# 上面命令表示,将本地的new分支推送到origin主机的new分支
# 如果后者不存在,则会被新建
  1. git push命令用于将本地分支的更新,推送到远程主

ckinmind avatar Mar 14 '17 15:03 ckinmind

8. 如何切换远程分支

参考资料:git 切换远程分支

ckinmind avatar Apr 17 '17 07:04 ckinmind

8. 忽略本地更新,强制和线上同步

git checkout . 参考资料:git如何放弃所有本地修改

ckinmind avatar May 05 '17 03:05 ckinmind

9. 无法git pull的问题

报错:fatal: refusing to merge unrelated histories 解决方案:git pull origin master --allow-unrelated-histories 参考资料:git无法pull仓库refusing to merge unrelated histories

ckinmind avatar May 07 '17 07:05 ckinmind

10. 关于git命令的简写

简写 原命令 解释
gst git status
gd git diff
gl git pull
gcol git checkout
gl git pull
gp git push

参考资料:Git命令行操作简写

ckinmind avatar May 12 '17 03:05 ckinmind

11. 关于初始化一个仓库

1. 使用别人的脚手架,删除.git 文件
2. 进入目标目录,执行以下命名
git init 
git add .
git commit -m "init"
git remote add origin https://github.com/ckinmind/xxx-xxxx.git
git push -u origin master

ckinmind avatar May 25 '17 15:05 ckinmind

12. 基于当前分支创建新的分支,并且提交到远程

git checkout -b test
git add .
...
ggp

参考资料:廖雪峰:创建与合并分支

ckinmind avatar Sep 12 '17 11:09 ckinmind

13. 打tag

// 带信息的tag
git tag -a v1.1 -m "this is message"
git push origin --tags

// 轻量级tag
git tag 1.3.0

ckinmind avatar Sep 15 '17 08:09 ckinmind

14. 合并分支

git merge dev  // 当前分支合并dev分支

ckinmind avatar Sep 16 '17 02:09 ckinmind

15. 删除远程分支和tag

git push origin --delete <branchName>   // 删除远程分支	
git push origin --delete tag <tagname>   // 删除远程tag

删除本地分支和tag

git branch -D <branchName>   // 删除本地分支
git tag -d <tagname>       // 删除本地tag

ckinmind avatar Sep 28 '17 03:09 ckinmind

16. 关于新建本地分支(不提交远程)

新建一个本地分支,修改文件之后,直接切换分支,会发现刚才的更改会直接作用到所有分支上,正确的做法是修改新建的本地分支之后先git add .然后再切换别的分支,这时候更改不会污染到别的分支上

ckinmind avatar Oct 12 '17 02:10 ckinmind

17. 回退版本

首先git log, 复制想要回退的commit id, 然后执行 git revert <commit id>, 注意这个回退是新增一次commit 取消掉那个提交的更改记录

ckinmind avatar Oct 19 '17 07:10 ckinmind

18. 添加SSH KEY

## 1. 生成key
ssh-keygen -t rsa -b 4096 -C "[email protected]"

## 2. 一路回车(不要密码)

## 3. 将SSH KEY添加到ssh-agent
eval "$(ssh-agent -s)"
ssh-add -K ~/.ssh/id_rsa

## 4. 复制KEY然后添加到Github中
pbcopy < ~/.ssh/id_rsa.pub   ## 复制

参考资料:Generating a new SSH key and adding it to the ssh-agent

ckinmind avatar Nov 02 '17 03:11 ckinmind

19. 如何clone 一个gist

git clone [email protected]:5834862.git

clone gist貌似只能通过ssh方式,需要现在本地添加ssh key,复制ssh地址之后还要去掉@后面的gist

参考:How to clone a Github Gist via SSH protocol?

ckinmind avatar Dec 11 '17 09:12 ckinmind

20. 如何创建一个空白分支

git checkout --orphan doc
git rm -rf .
git commit -am "new branch for documentation"

参考:在GIT中创建一个空分支

ckinmind avatar Apr 17 '18 07:04 ckinmind

21. 放弃本地更改,强制同步线上最新代码

git fetch --all
git reset --hard origin/master

git fetch 只是下载远程的库的内容不做任何的合并 git reset 把HEAD指向刚刚下载的最新的版本

ckinmind avatar Jun 15 '18 08:06 ckinmind

22. 保持当前分支没提交的代码,然后切换分支

git stash 
git checkout [另一个分支]
....
git checkout [原分支]
git stash pop  // 释放更改

这种做法的好处是如果当前分支的更改的代码你不暂时不想提交,又要切分支去,这时候可以使用这种方法,切回来的时候使用git stash pop就又保持之前的样子,而git add .会提交变动到暂存区,而前面的方法不会

ckinmind avatar Aug 31 '18 03:08 ckinmind

23. 强制同步本地代码到线上(会强制覆盖)

git push -u origin master -f 

但本地版本和线上版本不一样的时候,或者,我线上创建了一个项目,并且有初始化几个文件,然后我本地另外创建了项目,这时候我想关联这两个项目,用git remote add origin 项目git地址,然后本地提交正常提交时会遇到报错,这个时候直接强制更新好了,可能会将线上的文件覆盖

ckinmind avatar Dec 06 '18 15:12 ckinmind

24. 更改git仓库地址

git remote set-url origin 新的git地址http或者ssh

git仓库迁移遇到这种情况

ckinmind avatar Jan 08 '19 09:01 ckinmind

25. 更改git邮箱配置

# 查看git配置,看看当前的邮箱配置是什么
git config -l

# 将git邮箱设置为新的邮箱
git config --global user.email [email protected]

ckinmind avatar Jun 10 '19 01:06 ckinmind

26. 错误commit 如何取消

1. 未push

git commit -m "commit  message"
$ git reset HEAD~ 

2. 已经push


ckinmind avatar Nov 05 '19 07:11 ckinmind

27. rebase合并多个commit为一个

# 查看commitId
git log --online 

# 合并几次commit提交
git rebase -i HEAD~2

# 最后再提交

ckinmind avatar Nov 06 '19 07:11 ckinmind

28. rebase干净commit提交线

# gi pull之后需要合并远程,合并完成后执行rebase 
git rebase

# 查看提交线
git log --graph

# 提交
git push origin master

ckinmind avatar Nov 06 '19 07:11 ckinmind

29. 强制覆盖某个分支(完全舍弃某个分支代码,用另外一个分支)

# 比如当前在master分支,master分支的代码不要了,想完全用develop的代码覆盖过来
git reset --hard origin/develop

# 直接强推,master分支的代码就被develop强制全覆盖了
git push --force

ckinmind avatar Jun 09 '20 03:06 ckinmind