Cám ơn bạn, nhận tiện việc bạn nói về workflow ở dưới. Mình có một vài ý kiến như sau.
Thứ nhất, bạn có thể cho mình biết tại sao ở công ty bạn lại đặt luật là phải rebase develop branch vào feature branch thì mới được merge lại, sau đó merge lại thì nó lại là fast-forward được không?
Về chỗ này, thì mình biết có 2 cách để tích hợp code, 1 là dùng rebase, 2 là dùng merge để cập nhập code từ develop vào nhánh feature, tuỳ thuộc vào mục đích muốn xây dụng history thế nào để chọn, còn về mục đích tại sao lại chọn history như vậy thì mình cũng chưa có kinh nghiệm đánh giá. Mình cũng nhắc lại, sự khác biệt cơ bản giữa 2 phương pháp trên là git rebase sẽ không tạo ra commit mới, còn git merge sẽ tạo ra commit mới, nhưng việc dùng rebase nó khiến cho mốc thời gian rất lộn xộn, đôi khi commit mới nhất về thời gian lại đứng sau commit khác. Dĩ nhiên không phải lúc nào git merge cũng tạo ra commit mới, nọ phụ thuộc vào HEAD của nhánh được merge có thay đổi (thêm commit) so với lúc tạo ra nhánh feature hay không, đây chính là trường hợp fast-forward như bạn nói. Phần tiếp theo, bạn nói thế này thì mình cũng chưa hiểu rõ ý bạn lắm.
Thứ hai, về việc dùng reset --soft để tránh conflict thì mình cũng không đồng tình lắm. Mình nghĩ khi tích hợp hợp thì việc solve confict là điều rất khó tránh khỏi, hơn nữa việc dùng reset --soft chỉ là kết quả của việc muốn giữ lại nhưng thay đổi khi quay lại một commit nào đó trong quá khứ.
Cuối cùng, không biết có phải bạn nhầm không, theo mình biết squash commit dùng rebase chứ reset sao có thể.