git 操作记录

5 minute read

前言

大家在工作当中, 对于项目版本管理工具, 应该很多人都用过 SVN 和 GIT, 算是比较常见的二个工具了, 使用哪个比较方便感觉还是要看个人习惯, 有人喜欢图形界面, 也就有人喜欢命令, 但是对比版本管理来说, 还是 git 比较好用一点; 如果只是会用命令, 而不懂其中的逻辑结构, 根本发挥不出来 git 力量, 而且会给项目版本管理上带来副作用, 避免犯错就是要学习正确使用方法并理解他. 还要记得长期使用以免忘记怎么用, 所以来记录一下学到的知识. 后续只更新内容…

git 输入用户名和密码

如果我们 git clone 的下载代码的时候是连接的 https://而不是 git@git (ssh)的形式,当我们操作 git pull/push 到远程的时候,总是提示我们输入账号和密码才能操作成功,频繁的输入账号和密码会很麻烦,也特别烦恼,可以 git bash 进入你的项目目录,输入:

git config --global credential.helper store

git 账户设置

git config --global user.name "koringz"
git config --global user.email "260713986@qq.com"

检查秘钥是否添加成功

ssh -T git@github.com

以下命令可以检查当前秘钥:

ssh-add -l

此时我们想切换成另一个用户只需要把 id_rsa 换成 id_rsa_liqing 就可以了(当然,两个 pub 必须在对应的 github 用户的 ssh 配置中已经配置完毕)

生成 SSH 密钥过程: 查看是否已经有了 ssh 密钥

cd ~/.ssh

如果没有密钥则不会有此文件夹

生成秘钥

ssh-keygen -t rsa -C "weihuawang@yeah.net"

测试

ssh git@github.com

检查秘钥

cat ~/.ssh/id_rsa.pub

然后对这个 id_rsa.pub 文件重命名 id_rsa_homepub 将这部分代码添加到到 github 账户的的 SSH Keys 中,名字 id_rsa_home 随意。

gitlab/github 多账户下设置 ssh keys

切换多用户 git 账户

git config -l|grep credential.helper

Note:设置全局用户名和密码,生成 i_rsa 秘钥,然后配置 ssh。 然后再切换另一个用户名和密码,再生成 i_rsa 秘钥,再配置。每次只要切换全局用户和密码即可。

*以下命令可以删除秘钥(注意秘钥地址要换成你用 ssh-add -l 查出来的结果):

ssh-add -d /Users/liqing/.ssh/id_rsa

以下命令可以新增秘钥(注意秘钥地址要换成你要切换用户对应的秘钥地址):

ssh-add /Users/liqing/.ssh/id_rsa_liqing

备份秘钥:

ssh-key
ssh-keygen -t rsa -b 4096 -D koringz@github.com

同一台电脑不同账户密钥

- ssh-keygen -t rsa -C mywork@email.com

出现 Enter passphrase for key 错误,可以设置名称为 id_rsa_derek Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa):id_rsa_derek

添加到 SSH agent 中

ssh-add id_rsa_derek

http 替代 git

git config --global url.https://github.com/.insteadOf git://github.com/

git 操作

git 分支管理

git 提交出错

  • git push origin master
  • fatal: AggregateException encountered.
  • One or more errors occurred.
  • Username for ‘https://github.com’

使用 git remote -v 查看对应的克隆地址可以看到确实是以 https 方式 clone 的

git remote -v
origin https://github.com/username/repository.git (fetch)
origin https://github.com/username/repository.git (push)

删除并重新添加

git remote rm origin
git remote add origin git@github.com:username/repository.git
git push -u origin master

合并其他分支上指定的文件或者文件夹到当前分支

git checkout branchName folderName
git checkout branchName path

git 每次提交不需要密码

cd .git
vim config
[cridential]
helper  = store

删除远程 tag 标签 -usethis

git push origin :refs/tags/标签名
* 例如:git push origin :refs/tags/v3.10**
git tag -d v0.1.1

git 取消某一文件回退到线上版本 可以回退到最初版本 退回指定文件使用

git checkout .
git checkout -- filename

查看账户用户名和密码

git config user.name         查看用户名
git config user.email         *查看用户邮箱*

查看当前的全局变量

git config --global --list

创建密钥的步骤:

git config --global user.name weihuawangcom
git config --global user.email weihuawang@yeah.net

git 设置别名

git config --global alias.b branch

重新 git 资源-非常有用 On branch master Your branch is up-to-date with ‘origin/master.

git reset HEAD
git rm .

查看本地分支

git branch
git branch --list

查看远程分支

git branch -a

查看线上仓库

git branch --remotes

查看某个文件

cat test.txt

进入主分支 master,对 Dev 分支进行合并

git merge --no-ff dev

删除本地分支(D 强制删除)

git branch -d branchname

删除远程分支

git push origin :branchname

修改最后一次注释

git commit --amend

输入i进入修改模式,按Esc键退出编辑模式,输入:wq保存并退出。

通过 commit 编号回退到某个版本

git reset --hard [commit_id]

**如果要把 commit 记录也删除 需要强制 force 删除 commit 信息

git push origin HEAD --force

注:都是在主分支 master 上执行的命令 1 把 dev 分支上 app 下所有的文件合并到主分支 master 上

git checkout dev app

2 部分更新,如单独合并 app/css/index.css 到 master 主分支上

git checkout dev app/css/index.css

3 部分文件夹 dev 分支上 app 的 js 文件夹下有多个 JS 文件都更新了

git checkout dev app/js

合并过来的文件或者文件夹在主分支 master 上都是默认 add 过的, 然后需要在 master 分支上 commit,再 push 即可完成合并更新!

(多人协作) http://blog.csdn.net/kkkkkxiaofei/article/details/41483039

git 缓存区保存数据

git stash

缓存区取出数据合并

git stash pop

如果 git stash 出现不能改写 tree 里面的内容

git reset --mixed

重写树,然后再 gitpull

git 删除文件

git rm -f file

gitremote: 查看远程分支

git remote show seeRemoteName

添加需要更新远程仓库的 vuex 地址

git remote add upstream 'http'

更新远程的资源到自己的仓库

git remote update upstream
git push --up-stream origin currentRep

上传到远程服务器

git push origin HEAD:远程新branchName

remote 绑定账号密码

git remote set-url origin https://name:password@github.com/koringz/repo.git
git remote set-url origin https://ssh-key@github.com/koringz/koringz.github.io.git

git 合并和取消合并 iconfont–abort,想要本地合并相同的文件不冲突,可以使用 git merge -Xours <需要合并的文件

git checkout master
git merge --no-ff -m '注释合并分支'  <上一个分支>

取消合并

git merge --abort
git rebase --abort

**error: failed to push some refs to 'git@github.com:yangchao0718/cocos2d.git**
**hint: Updates were rejected because the tip of your current branch is behin hint: its remote counterpart. Integrate theremote **changes (e.g. hint: 'git pull ...') before pushing again

git pull --rebase

gitstash

先暂存修改文件 git stash , 再 git pull 分支文件到本地,如果 git stash pop 有冲突,查看 list,存在 stash@{0}文件,于是就合并 git stash show -p git apply && git stash drop,如果出错,就在本地找文件,找到»>捷键冲突,再次 git stash pop 成功了就显示 drop refs/stash{number}(00000…)

查看已经提交的修改内容

git log
git show commitId

git 从历史版本创建新分支 **通过 checkout 跟上 commitId 即可创建制定 commit 之前的本地分支 **

git checkout commitId -b 本地新branchName
git checkout -b 新分支名 2b1c225dcbbc4e1da11164af945344d88bc8f559

git tag 列出标签:

在控制台打印出当前仓库的所有标签

git tag

搜索符合模式的标签

git tag -l ‘v0.1.*’

创建轻量标签

git tag v0.1.2-light

创建附注标签

git tag -a v0.1.2 -m ``

切换到标签

git checkout [tagname]

master> (or) <tagname Git 创建一个 Develop 分支的命令

git checkout -b develop

查看版本号

git tag -l <tagname>

显示版本信息

git show <tagname>

删除标签

git tag -d v0.1.2

标签发布 将 v0.12 标签提交到 git 服务器

git push origin v0.1.2

将本地所有标签一次性提交到 git 服务器

git push origin --tags

查看某个文件

cat test.txt

进入主分支 master,对 Dev 分支进行合并

git merge --no-ff dev

删除本地分支(D 强制删除)

git branch -d branchname

删除远程分支

git push origin :branchname

远程仓库创建

git checkout -b branchname origin/branchname

查看本地文件

即可查看文件修改的地方

git diff filename

查看文件

cat filename

查看线上文件 ** **查看修改文件

git show  <commitid> --stat

查看文件修改部分,

git show <commitid> filepath

修改之前的某次注释

git rebase -i HEAD~2

你想修改哪条注释 就把哪条注释前面的 pick 换成 edit。方法就是上面说的编辑方式:i—编辑,把 pick 换成 edit—Esc—:wq

**然后:(接下来的步骤 bash 会提示) **

git commit --amend #修改注释,保存并退出后,输入:
git rebase --continue

切换分支并创建拉去远程分支 #如何清空某个分支里面所有的 commit 呢?还有一个场景,不熟悉 Git 的程序员门新建分支基于某个分支创建的,但是可能这个分支的历史 Commits 是不需要的。 #首先,你应该切换到你需要清空的分支 #你分支下的所有文件都成了待添加状态,我们可以直接执行 git add -A 添加,然后先存在 null_branch 中 git commit -am “Init commit.”

git checkout --orphan null_branch
git rm --cached -r .

git 设置 .gitignore 失效

Git 忽略规则:

在 git 中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如果没有这个文件,则需自己手工建立此文件)。这个文件每一行保存了一个匹配的规则例如:

\#               表示此为注释,将被Git忽略

*.a             表示忽略所有 .a 结尾的文件

!lib.a          表示但lib.a除外

/TODO           表示仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO

build/          表示忽略 build/目录下的所有文件,过滤整个build文件夹;

doc/*.txt       表示会忽略doc/notes.txt但不包括 doc/server/arch.txt

bin/:           表示忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件

/bin:           表示忽略根目录下的bin文件

/*.c:           表示忽略cat.c,不忽略 build/cat.c

debug/*.obj:    表示忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj

**/foo:         表示忽略/foo,a/foo,a/b/foo等

a/**/b:         表示忽略a/b, a/x/b,a/x/y/b等

!/bin/run.sh    表示不忽略bin目录下的run.sh文件

*.log:          表示忽略所有 .log 文件

config.php:     表示忽略当前路径的 config.php 文件

/mtk/           表示过滤整个文件夹

*.zip           表示过滤所有.zip文件

/mtk/do.c       表示过滤某个具体文件

.gitignore 规则不生效的解决办法把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效,原因是.gitignore 只能忽略那些原来没有被追踪的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore 是无效的。那么解决方法就是先把本地缓存删除(改变成未被追踪状态),然后再提交:

git rm -r --cached .
git add .

git 报错 Another git process seems to be running in this repository, e.g.an editor opened by ‘git commit’. Please make sure all processes are terminated then try again. If it still fails, a git process may have crashed in this repository earlier: remove the file manually to continue.翻译 原因在于 Git 在使用过程中遭遇了奔溃,部分被上锁资源没有被释放导致的。解决方案:进入项目文件夹下的 .git 文件中(显示隐藏文件夹或 rm .git/index.lock)删除 index.lock 文件即可。 git 使用 push 提交到远程仓库出现 The requested URL returned error: 403 错误 问题原因问题 主要出在原注册账号上,系统保存了账号的信息。

打开 cmd,输入命令:

rundll32.exe keymgr.dll,KRShowKeyMgr,出现存储的用户名和密码窗口

将 github 相关的条目删除, 重新执行命令:

git push -u origin master,提示输入账户名及密码后,成功。
---
git 出现 fatal: refusing to merge unrelated histories 错误
第二种方法:
使用这个强制的方法
git pull origin master --allow-unrelated-histories
后面加上 --allow-unrelated-histories , 把两段不相干的 分支进行强行合并
后面再push就可以了 git push gitlab master:init
---

git log -3 乱码 如果要设置 logOutputEncodingutf-8 的话, 就修改查看器的编码, 定义环境变量 LESSCHARSET=utf-8, 然后在 git 窗口设置:

---
git config --global i18n.commitEncoding utf-8
git config --global i18n.logOutputEncoding utf-8

之后在 git 窗口边框右键打开 options 进行设置 text 菜单下的 localezh_CN 对应的字符集 UTF-8. 最后重新打开 git 窗口查看日志信息:git log -3

git 增量包

git archive -o ../file.zip commitId-最新提交 $(git diff –name-only commitId-旧提交 … commitId-最新提交); 对比提交差异化, 从旧提交 id (通过扩展符代表多个提交)开始记录修改文件内容, 导出旧提交之后的所有提交的修改.

Updated: