Loading

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]

在版本库中永久删除文件(包括历史记录)

参考网址

  1. 资料库中删除文件
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
  1. 推送我们修改后的repo (与重建相比知识保留了原有的更新记录)(如果没有推送到远程,此步骤)
//以强制覆盖的方式推送
git push origin master --force --all
// 让打了 tag 的版本中页删除文件或文件夹, 强制推送 Git tags
git push origin master --force --tags
  1. 清理和回收空间
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模型

常见问题

git add -u -A . 的区别

3种操作:修改已有文件、添加新文件、删除文件
git add -A   保存所有的修改 (常用)
git add -u   保存修改和删除,不添加新文件(常用)
git add .    保存修改和添加新文件,不包括删除(少用)

配置问题

git status中文乱码:git config --global core.quotepath false

posted @ 2025-03-12 22:32  一起滚月球  阅读(12)  评论(0)    收藏  举报