git

git的骚操作

Posted by Zeusro on February 21, 2016

Image

设置git

1
2
git config --global user.name "Rose" 
git config --global user.email "[email protected]"

增加远程origin

1
git remote add  origin <>

提交

第一次提交

1
2
3
4
5
cd <project>
git remote add origin “”
git add .
git commit -am  "处女提交"
git push -u origin  master

日常提交

1
2
3
4
5
git add .
d:
cd <project>
git commit -am "test"
git push 

提交到别人的分支

1
2
3
4
5
6
7
8
git remote add up <开源项目地址>
git status 
git add . 
git commit -m git push origin branch
# 获取上游的变化
git pull up
git push origin master

或者

1
2
3
4
5
6
7
8
9
10
git remote add up <开源项目地址>
git status 
git add . 
git commit -m git push origin branch
# 获取上游的变化
git fetch up 
git rebase up/master
git push origin master


分支管理

  1. 推送特定分支

    1
    
     git push origin  NewUI
    
  2. 查看当前分支

    1
    
     git branch
    
  3. 列出远程分支

    1
    
     git branch -r
    
  4. 列出所有分支

    1
    
     git branch -a
    
  5. 创建分支

    1
    
     git branch branchName
    
  6. 切换分支

    1
    2
    
     git checkout  AndroidStudio
     git checkout  master
    
  7. 创建并切换到分支

    1
    
     git checkout -b branchName
    

灾难处理

修复未提交文件中的错误(重置)

如果你现在的工作目录(work tree)里搞的一团乱麻, 但是你现在还没有把它们提交; 你可以通过下面的命令, 让工作目录回到上次提交时的状态(last committed state): git reset --hard HEAD

回退所有内容到上一个版本

1
2
3
``` 
git reset HEAD^ 
```

回溯到特定的commitid

1
2
3
4
在.git/logs/head 里面找到我那个提交了用
```
git reset  <commit id> --hard
```

紧急热修复

思路是找到上次的稳定版本,修改后推送到目标分支.这种修复方式是最快的

1
2
3
4
5
6
7
```
# git checkout HEAD^1
回滚到上一次release的commitID
git checkout <commit ID>
git commit -am "fix"
git push origin HEAD:master
```

撤销上一次提交

1
2
3
4
(该操作非常凶险,所有这次提交的内容都会不见)
```
git revert HEAD
```

git log

1
2
3
4
5
6
7
8
9
10
11
git log --stat -n 5 // 简单的列出了修改过的文件
git log -p -n 5 // 详细的列出修改过的文件,及提交文件的对比
git log --graph // ASCII 字符串表示的简单图形,形象地展示了每个提交所在的分支及其分化衍合情况
git log --all --decorate --graph
git log --pretty=oneline
// 只显示哈希值和提交说明
git log --pretty=oneline/short/full/fuller/format:""(格式等)
git log --name-only // 仅在提交信息后显示已修改的文件清单
git log --no-merges // 不显示merge的log
:格式化日志
git log  --pretty=format:" %cd %h - %s" --since=3.days

参考链接: Git 基础 - 查看提交历史

其他命令

1
2
git checkout //后面不跟任何参数,则就是对工作区进行检查
git checkout --filename //从暂存区中恢复文件(确保filename与branch名称不同)

VS插件异常处理

  1. 无法将分支 master 发布到远程 origin,因为远程存储库中已存在具有同一名称的分支。发布此分支将导致远程存储库中的分支发生非快进更新。

    1
    
     git push --set-upstream origin master
    
  2. 无法将本地分支master发布到远程存储库origin

    Image

    1
    2
    
     git config branch.master.remote origin
     git config branch.master.merge refs/heads/master
    

git的错误处理

2边的文件都有修改

You have unmerged paths. (fix conflicts and run “git commit”) Move/rename/delete/copy/edit/whatever those files to get your code to the desired state, then git add the changes and git commit the conflict resolution.

1
git reset 9b25cd5635b4986aa1f1d614381226f79d123f87  --hard

中途初始化git项目之后从远程仓库中拉取发生错误 The following untracked working tree files would be overwritten by merge

1
2
git fetch origin
git reset --hard origin/master

git pull需要密码

1
把C:\Users\<用户>\.ssh里的id_rsa和id_rsa.pub文件复制到git安装目录下的.ssh目录里面即可

fatal: The current branch master has no upstream branch

1
2
3
[branch "master"]
remote = origin
merge = refs/heads/master

mac ssh 出现 permission deny 的解决方案

1
2
chmod 600 ~/.ssh/id_rsa
ssh-add  ~/.ssh/id_rsa

Your branch and ‘origin/master’ have diverged

1
2
3
4
注意,此操作会废了本地的提交

git fetch origin
git reset --hard origin/master

特别的技巧

修改.gitignore文件后,清理项目文件夹

1
2
3
4
git rm -r --cached .
git add .
git commit -am "clean"
git push

清除垃圾前提示

1
git clean -i -d

强制清除垃圾

1
git clean -f  -d

多个pushurl,一个pull地址

1
2
3
4
5
6
7
8
9
10
git remote set-url --push --add origin <url>
git remote set-url --push --add origin <url>

效果如下:

[remote "origin"]
url = <url1>
pushurl = <url2>
pushurl = <url1>
fetch = +refs/heads/*:refs/remotes/origin/*

修改远程url

1
git remote set-url  origin <URL>

从历史中永远删除某个文件

从 https://rtyley.github.io/bfg-repo-cleaner/ 中下载 bfg-1.13.0.jar

1
2
3
java -jar bfg.jar --strip-blobs-bigger-than 100M <git项目完整路径>
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push

push所有本地的分支到远程仓库中对应匹配的分支。

1
git config --global push.default matching

只有当前分支会被push到你使用git pull获取的代码。

1
git config --global push.default simple

更改origin url

1
git remote  set-url origin <URL>

代理

http 代理

1
2
3
4
5
6
7
8
9
    git config --global http.proxy 'socks5://127.0.0.1:1080'
    git config --global https.proxy 'socks5://127.0.0.1:1080'

    git config --local http.proxy 'http://127.0.0.1:1080'
    git config --local https.proxy 'http://127.0.0.1:1080'
    # 取消代理
    git config --global --unset http.proxy
    git config --global --unset https.proxy
    

ssh代理

1
ssh-copy-id [email protected]
1
2
3
4
5
cat << EOF >>  ~/.ssh/config
Host github.com
    ProxyCommand  ssh [email protected] nc %h %p
EOF

抹除所有提交历史,重新提交

1
2
3
4
5
6
7
8
9
git checkout --orphan latest_branch
git add -A
git commit -am "重新提交"
git branch -D master
git branch -m master
git push -f origin master


**gitlab的注意事项**
  1. gitlab的话,要先取消protected_branches中 master 的保护,然后再将本地的这个 master 提交到另外一个远程分支

    1
    
     git push origin master:temp;
    
  2. 然后设置这个temp 分支为默认分支,然后再提交到master远程分支

    1
    
     git push origin master:master;
    
  3. 删除 temp 远程分支,设置 master 为默认分支

    1
    2
    
     : 删除远程master分支
     git push origin :temp
    

设置发布用公钥

1
把本地用户的 ~/.ssh/id_rsa.pub 的内容追加到 Git 服务器仓库所属用户的 ~/.ssh/authorized_keys 文件的末尾即可。文件不存在的话用`ssh-keygen`生成

管理大文件

Git Large File Storage,原理是历史里面存放文件的指针,文件放在远程仓库,提高整个拉取,推送效率。

1
2
3
4
git lfs install
brew install git-lfs
git lfs track "*.psd"
git add .gitattributes

如果大文件以及存在于历史中,则需要输入另外的命令

1
git lfs migrate import --include="*.psd"

从别的地方重新拉取仓库之后,被track的文件已指针的形式存在,如果需要还原文件,得输入2个命令

1
2
git lfs install
git lfs pull

获得命令帮助

1
git lfs help

服务器可能需要安装 nc (yum install -y nc)命令

参考链接:

  1. ssh 连接提示 Permission denied (publickey) 怎么破
  2. Linux权限详解(chmod、600、644、666、700、711、755、777、4755、6755、7755)
  3. SSH Permission denied (publickey)解决办法
  4. 关于Gitlab若干权限问题
  5. git删除master分支后重建
  6. git: Your branch and ‘origin/master’ have diverged - how to throw away local commits?