git命令
常用操作
git init
git add [fil]
git commit -m ' '
git remote add [origin] [URL]
git push -u [origin] [master]
git push [origin] [master]
git remote -v
git remote rm [origin]
git remote set-url origin [URL] [URL_old]
git clone [SSH/URL]
git pull == git fetch+git merge
git checkout -- <file> 撤销修改(回到版本库/回调添加到暂存区后的状态)
git reset HEAD <file> 撤销暂存区修改(先回退到版本最新,再用checkout 才可以撤销修改)
git reset --hard [HEAD^^^^/[commit id]]
git log --graph --pretty=oneline --abbrev-commit 查看分支
git reflog 记录命令
git diff HEAD -- [filename] 查看工作区和git版本库里最新版本的差异
git diff -- [filename] (工作区与暂存区/版本库的差异)
git rebase 分叉的提交变成直线
git remote rm origin 删除远程地址
git remote add origin [git url] 添加远程地址
# 或者 git remote origin set-url [new git url] 重置?远程地址
# 或者直接修改 ./git/config 中的 url 参数
添加SSH Key
#创建SSH Key (有id_rsa和id_rsa.pub文件可跳过)
ssh-keygen -t rsa -C "xxxxxxx"
#在(Linux or windows) .ssh 目录下有两个文件,id_rsa是私钥,不能泄漏,id_rsa.pub 是公钥,可以告知别人
#GitHub在 "Add SSH Key" 粘贴 "id_rsa.pub" 的文件内容即可同步
分支管理
- 创建与合并分支
git checkout -b <name1> 创建并切换分支( 增加dev指针)
==> git brabch <name1> 创建
git checkout <name1> 切换
提交分支 无区别
git merge (--no-ff) <name1> (-m '')合并某分支到当前分支(所以先切回主线)
git branch -d <name1> 删除分支
git branch 查看当前分支
常见使用场景
解决冲突 -> 本地分支合并
//创建分支1,修改后提交1
git checkout -b feature1
//修改 readme.txt 文件
git add readme.txt
git commit -m 'branch feature1'
//切回主分支,提交2
git checkout master
//修改 readme.txt 文件 (与第一次修改不同)
git add readme.txt
git commit -m 'branch master'
//merge失败,解决冲突后,重新提交
git merge feature1 // (-X ours/theirs)
//提示发生冲突的文件,和解决后再把结果提交
//Merge conflict in readme.txt
//fix conflict and then commit the result
//git status 也可以告诉我们冲突的文件
//修改 readme.txt 文件
git add readme.txt
git commit -m 'conflict fixed'
//查看分支合并情况
git log --graph --pretty=oneline --abbrev-commit
场景: 解决冲突 -> 推送修改
```
//当你推送origin/dev分支时,已经有人推送了他的提交,此时你推送失败
git push origin dev
//failed to push some refs to ''
//Updates were rejected because the tip of your curent branch in behind
//'git pull ...' before pushing again
//此时先同步最新提交,在本地合并,解决冲突,再推送
git pull
//失败 没有指定本地 dev 分支与远程 origin/dev 分支的链接
git branch --set-upstream-to--origin/dev dev
git pull
//然后解决冲突,和 解决冲突 -> 本地分支 一样
```
分支管理策略
Fast forward 模式合并时,删除分支会丢掉分支信息
所以可以强制禁用Fast forward
git merge --no-ff -m 'merge with no ff' dev
分支策略
1,master分支 需remote,稳定,仅用来发布新版本
2,dev分支 需remote,不稳定,测试稳定后提交到master
3,Bug分支 本地即可, 修改bug
4,feature分支 与人合作则remote, 开发新功能, 合并到dev?
-
Bug分支(用完即删 no ff)
git stash 储藏当前工作现场 切换分支修Bug(没有stash,会导致当前未提交的文件还在) 完成,切回之前分支 git stash list git stash apply git stash drop =>git stash pop (恢复且丢弃stash) git stash apply [stash@{0}] 不填就是stash@{0}(最新stash) 存取类似栈(先进后出) -
feature分支 (开发新功能用)
- 其他,如何删除未合并的分支
git branch -D feature-vulcan
- 其他,如何删除未合并的分支
-
多人协作
git remote -v
git push origin dev (origin:仓库地址,dev:分支)
git checkout -b dev origin/dev ①创建远程分支
git pull ②拉取分支
stash应用:Bug 修复
当你需要在分支master上修复一个代号101的bug的任务时,当前正在dev上进行的工作还没有提交,你需要:
1. 保存当前分支的工作现场
git stash
此时会保存当前工作区,并回退到最近的一次提交的工作区上。
2. 切换到需要修复Bug的master分支,创建一个临时分支 issue-101
git checkout master
git checkout -b issue-101
3. 在临时分支上修复Bug后提交
4. 切换回master分支,进行合并
git checkout master
git merge --no-ff -m "mergedbug fix 101" issue-101
5. 切回 dev ,恢复之前保存的工作区,继续之前的工作
git stash list (是)
git stash apply + git stash drop
== git stash pop
(git stash apply stash@{0} 恢复指定的stash)
分支删除与恢复
git branch -d [branchName] //删除分支
git reflog 查看删除分支的 [commit_id]
git branch books_temp [comit_id]
在版本库中永久删除文件(包括历史记录)
- 资料库中删除文件
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch [path-to-your-remove-file]' --prune-empty --tag-name-filter cat -- --all
-----
1. 删除文件夹 rm 后需要加 -rf
2. [path-to-your-remove-file] 路径不能以'/'开头,否则回从 git 安装目录开始(举例: books/books1/....)
3. 可以建立 bash 脚本文件进行批量删除
#!/bin/bash
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch projects/Moon.mp3' --prune-empty --tag-name-filter cat -- --all
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch sound/Music_*.mp3' --prune-empty --tag-name-filter cat -- --all
- 推送我们修改后的repo (与重建相比知识保留了原有的更新记录)(如果没有推送到远程,此步骤)
//以强制覆盖的方式推送
git push origin master --force --all
// 让打了 tag 的版本中页删除文件或文件夹, 强制推送 Git tags
git push origin master --force --tags
- 清理和回收空间
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
分支合并时不把分支的commit记录合并到master的记录中
# 在dev1分支中,有多个commit记录,此时软重置到最开始的记录
git reset HEAD~n (n 可以是commit提交次数-1)
# 重新提交
git add -A
git commit -m 'dev1 first commit'
# 切换到master分支,合并
git merge --no-ff -m 'merge dev1' dev1
# 完成并查看
git log --graph --pretty=oneline --abbrev-commit
服务器(centos)建立远程仓库
//添加账户
adduser git
//使用密码或者添加证书
passwd git //设置密码
建立存放文件 /home/git/.ssh/authorized_keys //需要登录的用户公钥
//初始化仓库
git init --bare smaple.git
//权限管理
chown -R git:git smaple.git
git:x:1000:1000:,,,:/homt/git:/bin/git-bash //更改文件 /etc/passwd
//克隆远程仓库
git clone git@server:srv/sample.git
清空主分支提交记录
//新建分支,删除已有主分支,新分支改名,强制更新远程库
git checkout --orphan master_bk
git add -A
git commit -m 'new commit'
git branch -D master //强制删除分支
git branch -m master
git push -f origin master
提交修改 GitHub账号
//查看全局仓库下用户名和邮箱
git config --global user.email
git config --global user.name
//修改全局仓库下用户名和邮箱
git config --global user.email “邮箱”
git config --global user.name “用户名”
复制公钥不能生效的办法(未测试)
authorized_keys 更改文件权限:664-->644 ?
更改 .ssh 文件夹的拥有者为 git
chmod 644 .ssh
chown git:git .ssh
其他无关:centos 更改用户密码
su -c [command]
adduser [username]
passwd [username]
常见问题
git add -u -A . 的区别
3种操作:修改已有文件、添加新文件、删除文件
git add -A 保存所有的修改 (常用)
git add -u 保存修改和删除,不添加新文件(常用)
git add . 保存修改和添加新文件,不包括删除(少用)
配置问题
git status中文乱码:git config --global core.quotepath false

浙公网安备 33010602011771号